@hupan56/wlkj 2.7.12 → 3.0.0
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 +344 -78
- package/package.json +29 -29
- package/templates/.qoder/.runtime/ctx-cache-5660152f1d6dd819.md +23 -0
- package/templates/.qoder/.runtime/ctx-cache-afdce0dac06b25b0.md +23 -0
- package/templates/.qoder/.runtime/search-cache-eae7644e7b122f35.txt +1 -0
- package/templates/.qoder/learning/eval-history.jsonl +28 -0
- package/templates/data/index/wiki-index.json +8 -0
- package/templates/qoder/agents/insight-planning.md +1 -1
- package/templates/qoder/agents/insight-research.md +28 -15
- package/templates/qoder/commands/optional/wl-insight.md +159 -161
- package/templates/qoder/commands/optional/wl-report.md +4 -4
- package/templates/qoder/commands/optional/wl-status.md +2 -2
- package/templates/qoder/commands/wl-code.md +2 -2
- package/templates/qoder/commands/wl-design.md +2 -2
- package/templates/qoder/commands/wl-init.md +3 -3
- package/templates/qoder/commands/wl-prd.md +2 -2
- package/templates/qoder/commands/wl-req.md +43 -0
- package/templates/qoder/commands/wl-search.md +8 -8
- package/templates/qoder/commands/wl-task.md +17 -17
- package/templates/qoder/commands/wl-test.md +41 -15
- package/templates/qoder/config.yaml +17 -1
- package/templates/qoder/hooks/session-start.py +12 -22
- package/templates/qoder/nul +4 -0
- package/templates/qoder/rules/wl-pipeline.md +22 -48
- package/templates/qoder/scripts/README.md +139 -0
- package/templates/qoder/scripts/common/autotest_auth.py +109 -0
- package/templates/qoder/scripts/common/bootstrap.py +145 -0
- package/templates/qoder/scripts/common/check_publish.py +98 -0
- package/templates/qoder/scripts/common/cmd_registry.py +112 -0
- package/templates/qoder/scripts/common/config.py +187 -0
- package/templates/qoder/scripts/common/contract.py +317 -0
- package/templates/qoder/scripts/common/developer.py +2 -1
- package/templates/qoder/scripts/common/feishu.py +10 -9
- package/templates/qoder/scripts/common/guard.py +159 -0
- package/templates/qoder/scripts/common/identity.py +121 -2
- package/templates/qoder/scripts/common/kg_capabilities.py +182 -0
- package/templates/qoder/scripts/common/mcp_base.py +268 -0
- package/templates/qoder/scripts/common/paths.py +187 -1
- package/templates/qoder/scripts/common/result.py +223 -0
- package/templates/qoder/scripts/common/roles.py +60 -0
- package/templates/qoder/scripts/common/task_utils.py +21 -9
- package/templates/qoder/scripts/common/test_extract.py +115 -0
- package/templates/qoder/scripts/kg/__init__.py +11 -0
- package/templates/qoder/scripts/kg/build_entity_registry.py +196 -0
- package/templates/qoder/scripts/kg/build_relations.py +127 -0
- package/templates/qoder/scripts/{build_style_index.py → kg/build_style_index.py} +39 -10
- package/templates/qoder/scripts/kg/build_workflows.py +144 -0
- package/templates/qoder/scripts/{context_pack.py → kg/context_pack.py} +18 -11
- package/templates/qoder/scripts/{enrich_prompt.py → kg/enrich_prompt.py} +232 -226
- package/templates/qoder/scripts/{extract_api_params.py → kg/extract.py} +398 -246
- package/templates/qoder/scripts/{kg.py → kg/kg.py} +638 -708
- package/templates/qoder/scripts/{kg_build.py → kg/kg_build.py} +618 -612
- package/templates/qoder/scripts/{kg_build_db.py → kg/kg_build_db.py} +333 -327
- package/templates/qoder/scripts/{kg_duckdb.py → kg/kg_duckdb.py} +38 -37
- package/templates/qoder/scripts/{kg_incremental.py → kg/kg_incremental.py} +420 -393
- package/templates/qoder/scripts/{kg_link_db.py → kg/kg_link_db.py} +230 -224
- package/templates/qoder/scripts/{kg_semantic.py → kg/kg_semantic.py} +156 -150
- package/templates/qoder/scripts/kg/prefetch.py +359 -0
- package/templates/qoder/scripts/{search_index.py → kg/search_index.py} +70 -14
- package/templates/qoder/scripts/mcp/__init__.py +11 -0
- package/templates/qoder/scripts/{kg_mcp_server.py → mcp/kg_mcp_server.py} +77 -272
- package/templates/qoder/scripts/{lanhu_stdio_wrapper.py → mcp/lanhu_stdio_wrapper.py} +125 -119
- package/templates/qoder/scripts/{check_mcp.py → mcp/mcp_doctor.py} +515 -298
- package/templates/qoder/scripts/{mcp_launcher.py → mcp/mcp_launcher.py} +442 -414
- package/templates/qoder/scripts/{mysql_mcp_server.py → mcp/mysql_mcp_server.py} +347 -396
- package/templates/qoder/scripts/{zentao_mcp_server.py → mcp/zentao_mcp_server.py} +384 -424
- package/templates/qoder/scripts/report/__init__.py +11 -0
- package/templates/qoder/scripts/{add_session.py → report/add_session.py} +250 -244
- package/templates/qoder/scripts/{archive_prd.py → report/archive_prd.py} +383 -377
- package/templates/qoder/scripts/{eval_prd.py → report/eval_prd.py} +73 -11
- package/templates/qoder/scripts/{export.py → report/export.py} +63 -0
- package/templates/qoder/scripts/{fill_prototype.py → report/fill_prototype.py} +6 -0
- package/templates/qoder/scripts/{gen_design_doc.py → report/gen_design_doc.py} +400 -394
- package/templates/qoder/scripts/{learn.py → report/learn.py} +152 -146
- package/templates/qoder/scripts/{learn_aggregate.py → report/learn_aggregate.py} +207 -201
- package/templates/qoder/scripts/{report.py → report/report.py} +287 -281
- package/templates/qoder/scripts/report/req.py +222 -0
- package/templates/qoder/scripts/report/role.py +33 -0
- package/templates/qoder/scripts/{status.py → report/status.py} +634 -628
- package/templates/qoder/scripts/setup/__init__.py +11 -0
- package/templates/qoder/scripts/setup/carriers.py +662 -0
- package/templates/qoder/scripts/{init_doctor.py → setup/init_doctor.py} +63 -26
- package/templates/qoder/scripts/{install_qoderwork.py → setup/install_qoderwork.py} +36 -26
- package/templates/qoder/scripts/{platform_doctor.py → setup/platform_doctor.py} +265 -259
- package/templates/qoder/scripts/{repo_root.py → setup/repo_root.py} +112 -106
- package/templates/qoder/scripts/{setup.py → setup/setup.py} +113 -4
- package/templates/qoder/scripts/{setup_lanhu.py → setup/setup_lanhu.py} +973 -963
- package/templates/qoder/scripts/task/__init__.py +11 -0
- package/templates/qoder/scripts/{git_sync.py → task/git_sync.py} +52 -31
- package/templates/qoder/scripts/{syncgate.py → task/syncgate.py} +6 -0
- package/templates/qoder/scripts/task/task.py +221 -0
- package/templates/qoder/scripts/task/task_lifecycle.py +596 -0
- package/templates/qoder/scripts/task/task_query.py +161 -0
- package/templates/qoder/scripts/task/task_relations.py +424 -0
- package/templates/qoder/scripts/{team_sync.py → task/team_sync.py} +93 -20
- package/templates/qoder/scripts/test/__init__.py +11 -0
- package/templates/qoder/scripts/{autotest.py → test/autotest.py} +1174 -1751
- package/templates/qoder/scripts/{autotest_batch.py → test/autotest_batch.py} +242 -224
- package/templates/qoder/scripts/test/autotest_data.py +675 -0
- package/templates/qoder/scripts/{autotest_run.py → test/autotest_run.py} +309 -297
- package/templates/qoder/scripts/{benchmark.py → test/benchmark.py} +6 -0
- package/templates/qoder/scripts/{kg_auto_login.py → test/kg_auto_login.py} +202 -196
- package/templates/qoder/scripts/{kg_test_runner.py → test/kg_test_runner.py} +7 -1
- package/templates/qoder/scripts/{page_probe.py → test/page_probe.py} +465 -459
- package/templates/qoder/scripts/wlkj.py +116 -0
- package/templates/qoder/settings.json +1 -10
- package/templates/qoder/skills/design-import/SKILL.md +226 -226
- package/templates/qoder/skills/design-review/SKILL.md +82 -82
- package/templates/qoder/skills/prd-generator/SKILL.md +26 -16
- package/templates/qoder/skills/prd-review/SKILL.md +5 -5
- package/templates/qoder/skills/prototype-generator/SKILL.md +256 -256
- package/templates/qoder/skills/spec-coder/SKILL.md +4 -4
- package/templates/qoder/skills/spec-generator/SKILL.md +4 -4
- package/templates/qoder/skills/test-generator/SKILL.md +5 -5
- package/templates/qoder/skills/wl-code/SKILL.md +4 -4
- package/templates/qoder/skills/wl-commit/SKILL.md +4 -4
- package/templates/qoder/skills/wl-design/SKILL.md +3 -3
- package/templates/qoder/skills/wl-init/SKILL.md +8 -8
- package/templates/qoder/skills/wl-insight/SKILL.md +5 -5
- package/templates/qoder/skills/wl-prd-full/SKILL.md +6 -6
- package/templates/qoder/skills/wl-prd-quick/SKILL.md +6 -6
- package/templates/qoder/skills/wl-prd-review/SKILL.md +4 -4
- package/templates/qoder/skills/wl-report/SKILL.md +7 -7
- package/templates/qoder/skills/wl-search/SKILL.md +13 -13
- package/templates/qoder/skills/wl-spec/SKILL.md +5 -5
- package/templates/qoder/skills/wl-status/SKILL.md +5 -5
- package/templates/qoder/skills/wl-task/SKILL.md +6 -6
- package/templates/qoder/skills/wl-test/SKILL.md +102 -39
- package/templates/root/AGENTS.md +39 -40
- package/templates/qoder/hooks/inject-workflow-state.py +0 -169
- package/templates/qoder/scripts/__pycache__/check_mcp_launch.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/__pycache__/install_qoderwork.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/__pycache__/mcp_launcher.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/__pycache__/platform_doctor.cpython-39.pyc +0 -0
- package/templates/qoder/scripts/check_carriers.py +0 -238
- package/templates/qoder/scripts/check_mcp_launch.py +0 -183
- package/templates/qoder/scripts/check_qoderwork_consistency.py +0 -166
- package/templates/qoder/scripts/collect_prds.py +0 -31
- package/templates/qoder/scripts/common/mentions.py +0 -134
- package/templates/qoder/scripts/common/utf8.py +0 -38
- package/templates/qoder/scripts/extract_routes.py +0 -54
- package/templates/qoder/scripts/extract_routes_tree.py +0 -78
- package/templates/qoder/scripts/handoff.py +0 -22
- package/templates/qoder/scripts/init_developer.py +0 -76
- package/templates/qoder/scripts/parse_prds.py +0 -33
- package/templates/qoder/scripts/role.py +0 -51
- package/templates/qoder/scripts/sync_carriers.py +0 -259
- package/templates/qoder/scripts/task.py +0 -1261
- package/templates/qoder/scripts/workspace_init.py +0 -102
- package/templates/qoder/skills/prompt-enrich/SKILL.md +0 -90
- package/templates/qoder/skills/prototype-generator/SKILL.md.zcode-79180-2af4721f-f9a6-412c-88db-c0af680d211b.tmp +0 -0
- /package/templates/qoder/scripts/{secure-ls.js → test/secure-ls.js} +0 -0
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-insight
|
|
3
|
-
description: "
|
|
4
|
-
argument-hint: "[
|
|
3
|
+
description: "需求澄清对焦 + 可选调研 + 未来规划。流水线的'上游探索站'。最高频场景:用户描述模糊/产品听不懂时,快速对焦(必要时出原型图帮助理解),对齐后再问要不要调研/规划。把'到底要什么'想清楚,结论交给 /wl-prd-full 落地。"
|
|
4
|
+
argument-hint: "[主题]"
|
|
5
5
|
auto-approve: true
|
|
6
6
|
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit, Agent, WebSearch]
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
-
# /wl-insight -
|
|
9
|
+
# /wl-insight - 需求澄清对焦(默认)/ 调研 / 规划
|
|
10
10
|
|
|
11
11
|
User input: $ARGUMENTS
|
|
12
12
|
|
|
13
|
-
>
|
|
14
|
-
>
|
|
15
|
-
>
|
|
13
|
+
> **流水线的上游探索站**。但"上游探索"不是一股脑深挖——
|
|
14
|
+
> **最高频的场景是:产品听不懂用户在说什么,需要快速对焦**。
|
|
15
|
+
>
|
|
16
|
+
> **核心原则:让用户听懂,不在于简短。**
|
|
17
|
+
> 听不懂就升级手段(文字→原型),直到对齐。
|
|
18
|
+
> 每一步都停下来等用户确认,绝不擅自往下深挖。
|
|
16
19
|
|
|
17
20
|
---
|
|
18
21
|
|
|
@@ -22,254 +25,249 @@ User input: $ARGUMENTS
|
|
|
22
25
|
```bash
|
|
23
26
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
24
27
|
```
|
|
25
|
-
> 后续脚本统一用 `python "$R/.qoder/scripts/
|
|
28
|
+
> 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"` 或 `python "$R/.qoder/scripts/wlkj.py" <命令>`。
|
|
26
29
|
|
|
27
30
|
---
|
|
28
31
|
|
|
29
32
|
## 🔒 语言锁(最高优先级)
|
|
30
33
|
|
|
31
|
-
**全部输出必须简体中文。**
|
|
32
|
-
禁止任何英文句子(技术专有名词如 MCP/
|
|
34
|
+
**全部输出必须简体中文。** 含理解复述、原型标注、结论、建议。
|
|
35
|
+
禁止任何英文句子(技术专有名词如 MCP/JTBD/Kano 可保留英文缩写)。
|
|
33
36
|
|
|
34
37
|
---
|
|
35
38
|
|
|
36
|
-
## STEP 0:
|
|
39
|
+
## STEP 0: 路由(看用户说了什么 / 没说什么)
|
|
37
40
|
|
|
38
|
-
| 信号 |
|
|
39
|
-
|
|
40
|
-
| "
|
|
41
|
-
| "调研竞品""对标 XX""行业都怎么做""
|
|
42
|
-
| "接下来做什么""下个版本""路线图""MVP 范围""规划" |
|
|
43
|
-
| 模糊 / 拿不准 | **先问** | "你是想发现新需求、调研外部、还是规划未来?" |
|
|
41
|
+
| 信号 | 走哪段 | 说明 |
|
|
42
|
+
|------|--------|------|
|
|
43
|
+
| **任何输入**(含无主题)/ "听不懂""不确定""他说的是啥" / 模糊描述 | **【默认】clarify 对焦** | 最高频,最高优先级。先对焦,别急着分析 |
|
|
44
|
+
| "调研竞品""对标 XX""行业都怎么做""看看别人" | research 调研 | **但即便用户主动说调研,也先 clarify 确认要调研的是什么** |
|
|
45
|
+
| "接下来做什么""下个版本""路线图""MVP 范围""规划" | plan 规划 | 同上,先对齐现状再规划 |
|
|
44
46
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
想做哪种探索?
|
|
49
|
-
1. 需求发现 —— 从现状痛点/竞品空白找新机会("我发现 XX 不好用"这类)
|
|
50
|
-
2. 外部调研 —— 对标竞品/行业趋势/技术方案("看看别人怎么做")
|
|
51
|
-
3. 未来规划 —— Gap 分析 + MVP 范围 + 路线图("下个版本做什么")
|
|
52
|
-
|
|
53
|
-
告诉我主题或想法,我来锚定现状做探索。
|
|
54
|
-
```
|
|
47
|
+
> ⚠️ **路由铁律:clarify 是必经的第一段。** 即便用户说"调研竞品",
|
|
48
|
+
> 也要先 30 秒确认"你要调研的这个东西,我理解对了吗?"。
|
|
49
|
+
> 一股脑直接深挖 = 失败。
|
|
55
50
|
|
|
56
51
|
---
|
|
57
52
|
|
|
58
|
-
## 🔒
|
|
53
|
+
## 🔒 通用前置(所有段必做)
|
|
59
54
|
|
|
60
55
|
1. **身份**:读 `.qoder/.developer`,缺失 → 停下提示 `/wl-init`
|
|
61
|
-
2. **现状锚点**:`python "$R/.qoder/scripts/context_pack.py" <关键词> --platform <web|app
|
|
62
|
-
3. **历史参考**:扫 `data/docs/prd/`
|
|
56
|
+
2. **现状锚点**:`python "$R/.qoder/scripts/kg/context_pack.py" <关键词> --platform <web|app>`(必跑,秒级)
|
|
57
|
+
3. **历史参考**:扫 `data/docs/prd/` 看已做过的,扫历史 insight 报告看是否聊过
|
|
63
58
|
|
|
64
59
|
---
|
|
65
60
|
|
|
66
|
-
##
|
|
61
|
+
## 【默认段】clarify(需求澄清对焦)—— 三级升级
|
|
62
|
+
|
|
63
|
+
**目标:让用户听懂"产品对他的需求的理解",并对齐。不在于简短,在于听懂。**
|
|
64
|
+
**听不懂就升级手段,直到对齐为止。**
|
|
65
|
+
|
|
66
|
+
### 升级阶梯(从①开始,听懂了就停,不越级)
|
|
67
|
+
|
|
68
|
+
#### 第①级:文字对焦(默认起点)
|
|
69
|
+
|
|
70
|
+
跑 context_pack 秒扫现状后,**立刻**输出给用户看:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
我理解你要的是:
|
|
74
|
+
① {一句话复述需求的核心}
|
|
75
|
+
② {如果有第二层,补充}
|
|
76
|
+
|
|
77
|
+
现状:
|
|
78
|
+
- {项目里已有什么,context_pack 命中: 文件/模块}
|
|
79
|
+
- {还没有什么}
|
|
80
|
+
|
|
81
|
+
我拿不准的点(请逐条确认/纠正):
|
|
82
|
+
Q1. {第一个不确定的细节} → 你的意思是 A 还是 B?
|
|
83
|
+
Q2. {第二个} → ?
|
|
84
|
+
Q3. {第三个} → ?
|
|
85
|
+
|
|
86
|
+
你看我理解对了吗?哪条偏了?
|
|
87
|
+
```
|
|
67
88
|
|
|
68
|
-
|
|
89
|
+
→ **停。等用户回答。** 别往下走。
|
|
90
|
+
→ 用户确认对齐了 → 进【第 2 段:问要不要调研】
|
|
91
|
+
→ 用户说"还是没懂"或反复说不清 → 进第②级
|
|
69
92
|
|
|
70
|
-
|
|
93
|
+
#### 第②级:文字说不明白 → 快速原型图(对齐工具,不是产出)
|
|
94
|
+
|
|
95
|
+
**当文字反复解释用户仍听不懂/拿不准时,出一张原型图当"视觉问句"。**
|
|
96
|
+
用项目真实风格,让用户直观看到"你想要的是不是大概这样":
|
|
71
97
|
|
|
72
|
-
**第 1 步|锚定现状**
|
|
73
98
|
```bash
|
|
74
|
-
|
|
99
|
+
# Web 管理端
|
|
100
|
+
python "$R/.qoder/scripts/wlkj.py" prototype --template "$R/.qoder/templates/prototype-web.html"
|
|
101
|
+
# APP 移动端
|
|
102
|
+
python "$R/.qoder/scripts/wlkj.py" prototype --template "$R/.qoder/templates/prototype-app.html"
|
|
75
103
|
```
|
|
76
|
-
读懂:现状怎么做的、涉及哪些页面/字段/接口、有什么已知限制。
|
|
77
104
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
105
|
+
原型要求:
|
|
106
|
+
- **项目真实风格**(Web=Vben Admin+Ant Design / App=Vant),不是草稿线框图
|
|
107
|
+
- **聚焦你要对焦的那一个点**(不是完整功能,是对焦用的最小可视)
|
|
108
|
+
- 用真实图标系统(`data/index/icon-reference.json`),**绝不 emoji**
|
|
109
|
+
- 标注清楚:"这是帮你确认理解的草图,不是最终设计"
|
|
83
110
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
111
|
+
给用户看时说:
|
|
112
|
+
```
|
|
113
|
+
为了确认我理解对了,出了张草图(用咱们项目风格):
|
|
114
|
+
{原型路径}
|
|
87
115
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
2. 问:"这个分析对吗?哪个 job 要深入?"
|
|
91
|
-
3. 确认后写报告,末尾提示出口衔接
|
|
116
|
+
你想要的是不是大概这样?哪里不对?
|
|
117
|
+
```
|
|
92
118
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
119
|
+
⚠️ **这个原型是"沟通草稿",不进 PRD,不入 team_sync,不归档。**
|
|
120
|
+
它是即用即弃的对焦工具,就像白板上画的图。
|
|
121
|
+
**除非用户强烈说"这个挺好,留下进 PRD"** → 才提示转 `/wl-design` 走正式原型链路。
|
|
96
122
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
- 已知限制:...
|
|
123
|
+
→ 用户看懂并确认 → 进【第 2 段】
|
|
124
|
+
→ 用户看了还是不懂/方向不对 → 进第③级
|
|
100
125
|
|
|
101
|
-
|
|
102
|
-
1. 当 {情境},我想要 {...},以便 {...}
|
|
103
|
-
2. ...
|
|
126
|
+
#### 第③级:兜底 —— 回到现状深挖重解释
|
|
104
127
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
128
|
+
极少数情况:原型也说不通。说明对现状的理解有偏差。
|
|
129
|
+
- 重跑 context_pack,**换关键词**,深挖用户提的模块到底怎么运作
|
|
130
|
+
- 把"现状到底是怎么回事"用最朴素的话重新讲一遍
|
|
131
|
+
- 问用户:"是我对现状理解错了,还是你要的跟现状差很远?"
|
|
132
|
+
- 最多 2 轮,然后请用户用他自己的话再描述一次需求
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
## 【第 2 段】对齐后:问要不要调研(必须问,不擅自做)
|
|
137
|
+
|
|
138
|
+
**clarify 对齐后,不要直接一股脑做调研。问用户要不要。**
|
|
108
139
|
|
|
109
|
-
## 下一步
|
|
110
|
-
要把握哪个机会?说"转 PRD"我把它作为现状输入,进 /wl-prd-full 参考模式落地。
|
|
111
140
|
```
|
|
141
|
+
需求对齐了 👍
|
|
142
|
+
|
|
143
|
+
接下来要不要我做外部调研?(看看竞品/行业怎么做,给咱们参考)
|
|
144
|
+
A. 要调研 —— 我派几个 agent 并行去看(竞品对标/技术方案/用户场景),
|
|
145
|
+
大概 X 分钟,产出调研报告
|
|
146
|
+
B. 不用调研,需求清楚了直接往下走
|
|
147
|
+
|
|
148
|
+
选 A 还是 B?
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
→ **用户选 A** → 进 research 段(派多 agent)
|
|
152
|
+
→ **用户选 B** → 直接进【第 3 段:出结论 + 衔接】
|
|
153
|
+
|
|
154
|
+
> 这一步的存在意义:调研耗时,且很多时候用户心里已经有数(只是没说清楚)。
|
|
155
|
+
> 强行调研 = 浪费时间。**把"要不要调研"的决定权还给用户。**
|
|
112
156
|
|
|
113
157
|
---
|
|
114
158
|
|
|
115
|
-
##
|
|
159
|
+
## research 段(仅当用户选 A)—— 多 agent 调研
|
|
116
160
|
|
|
117
|
-
|
|
161
|
+
**目标**:用成熟方法论框架,对标外部,给已对齐的需求提供外部参考。
|
|
118
162
|
|
|
119
|
-
###
|
|
163
|
+
### 方法论框架(每个 agent 按视角选合适的)
|
|
164
|
+
- **竞品对标** → 竞品矩阵(功能对比表) + 差异化机会
|
|
165
|
+
- **技术方案** → 技术选型对比(方案A vs B,成本/风险/成熟度)
|
|
166
|
+
- **用户场景** → JTBD("用户在完成什么 job")+ Kano(基础/期望/兴奋需求分类)
|
|
167
|
+
- **行业趋势** → 趋势时间线 + 机会窗口
|
|
120
168
|
|
|
121
|
-
|
|
122
|
-
- 跑 context_pack 知道现状
|
|
123
|
-
- 确定 2-4 个调研视角(按主题选):竞品对标 / 行业趋势 / 技术方案 / 用户场景
|
|
169
|
+
### 流程(目标 4-6 轮)
|
|
124
170
|
|
|
125
|
-
**第 2
|
|
126
|
-
|
|
171
|
+
**第 1 步|确定调研视角**(2-4 个,按主题选)
|
|
172
|
+
**第 2 步|并行派多 agent**(核心)
|
|
173
|
+
**同一条消息**派 2-4 个 Agent,每个一个视角 + 一个方法论框架,并发跑:
|
|
127
174
|
```
|
|
128
175
|
每个 Agent 的任务:
|
|
129
|
-
- 视角:{
|
|
130
|
-
-
|
|
176
|
+
- 视角:{竞品对标/技术方案/用户场景/行业趋势}
|
|
177
|
+
- 方法论:{对应框架,见上}
|
|
178
|
+
- 用 WebSearch 搜 3-5 个权威源(官方文档/行业报告/技术博客/公开案例)
|
|
131
179
|
- 写中间产物:workspace/members/{dev}/drafts/research-agent-{N}-{视角}.md
|
|
132
|
-
- 含:关键发现 / 对本项目的启发 /
|
|
180
|
+
- 含:关键发现 / 对本项目的启发 / Gap 信号(外部做得好而我们没做的) / 来源链接
|
|
133
181
|
```
|
|
134
|
-
> 派 Agent
|
|
182
|
+
> 派 Agent 时给**具体的视角描述 + 方法论 + 本项目现状摘要**,让调研有针对性。
|
|
135
183
|
|
|
136
184
|
**第 3 步|合并 + Gap 提取**
|
|
137
185
|
1. 读所有 `research-agent-*.md`
|
|
138
186
|
2. 合并成一份调研报告,按视角组织
|
|
139
187
|
3. 对每个发现标:**本项目现状 vs 外部做法 → Gap**
|
|
140
|
-
4. 列"机会信号"
|
|
188
|
+
4. 列"机会信号"
|
|
141
189
|
|
|
142
190
|
**第 4 步|清理中间产物 + 与用户确认 + 出报告**
|
|
143
191
|
```bash
|
|
144
|
-
# 合并后必须删中间产物(team_sync staging allowlist 也拒绝这类文件)
|
|
145
192
|
rm -f workspace/members/{dev}/drafts/research-agent-*.md
|
|
146
193
|
```
|
|
147
194
|
1. 把调研发现 + Gap + 机会信号**一次性编号列清**
|
|
148
195
|
2. 问:"这个调研对吗?哪个机会值得跟进?"
|
|
149
|
-
3.
|
|
196
|
+
3. 确认后写报告
|
|
150
197
|
|
|
151
198
|
### 输出结构
|
|
152
199
|
```markdown
|
|
153
200
|
# 外部调研 - {主题}({date})
|
|
154
201
|
|
|
155
|
-
##
|
|
156
|
-
{
|
|
202
|
+
## 调研视角与方法
|
|
203
|
+
{本次派了哪几个视角,各用什么方法论}
|
|
157
204
|
|
|
158
205
|
## 现状锚定
|
|
159
|
-
{context_pack
|
|
206
|
+
{context_pack 摘要}
|
|
160
207
|
|
|
161
208
|
## 调研发现(按视角)
|
|
162
|
-
### 视角 1
|
|
209
|
+
### 视角 1:竞品对标(竞品矩阵)
|
|
163
210
|
| 竞品 | 做法摘要 | 我们的 Gap | 来源 |
|
|
164
|
-
### 视角 2:行业趋势
|
|
165
211
|
...
|
|
166
212
|
|
|
167
213
|
## 机会信号
|
|
168
214
|
1. {外部做得好而我们没做的}
|
|
169
|
-
2. ...
|
|
170
|
-
|
|
171
|
-
## 下一步
|
|
172
|
-
要跟进哪个机会?说"转 PRD"我把它作为现状输入,进 /wl-prd-full 参考模式落地。
|
|
173
|
-
```
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## 类型 3:plan(未来规划)—— Gap 分析 + OST 第 3 层
|
|
178
|
-
|
|
179
|
-
**目标**:把"未来想做成什么样"拆成 MVP + roadmap,输出方案候选。
|
|
180
|
-
|
|
181
|
-
### 流程(目标 4-5 轮)
|
|
182
|
-
|
|
183
|
-
**第 1 步|现状 vs 理想态(Gap 分析核心)**
|
|
184
|
-
1. 现状:context_pack 取真实代码/页面/字段
|
|
185
|
-
2. 理想态:用户描述 / 最近一份 research 报告的结论 / 行业基准
|
|
186
|
-
3. 建 Gap 表:
|
|
187
|
-
|
|
188
|
-
| 维度 | 现状 | 理想态 | Gap | 证据来源 |
|
|
189
|
-
|------|------|--------|-----|---------|
|
|
190
|
-
|
|
191
|
-
**第 2 步|Gap 排优先级**
|
|
192
|
-
按**业务价值 × 可行性**打分(不照搬 RICE,探索阶段粒度粗点就行):
|
|
193
|
-
- 业务价值:1=锦上添花 / 2=提效 / 3=解锁核心场景 / 4=不做会丢市场
|
|
194
|
-
- 可行性:看 context_pack 的现状,改动量大不大、有没有先例可复用
|
|
195
|
-
- 分 = 价值 × 可行性,取 Top N
|
|
196
|
-
|
|
197
|
-
**第 3 步|拆 MVP + roadmap(OST 第 3 层 Solution)**
|
|
198
|
-
- **MVP(本期)**:高价值高可行性的 Gap,**当前人力能做完的**
|
|
199
|
-
- **Roadmap(后续)**:按版本分组,标依赖关系(A 依赖 B 先做)
|
|
200
|
-
|
|
201
|
-
**第 4 步|与用户确认 + 出报告**
|
|
202
|
-
1. 把 Gap 表 + MVP + roadmap **一次性编号列清**
|
|
203
|
-
2. 问:"这个规划对吗?MVP 范围合理吗?"
|
|
204
|
-
3. 确认后写报告,末尾提示出口衔接
|
|
205
|
-
|
|
206
|
-
### 输出结构
|
|
207
|
-
```markdown
|
|
208
|
-
# 未来规划 - {主题}({date})
|
|
209
|
-
|
|
210
|
-
## 现状 vs 理想态(Gap 分析)
|
|
211
|
-
| 维度 | 现状 | 理想态 | Gap | 价值 | 可行性 | 分 |
|
|
212
|
-
|
|
213
|
-
## MVP(本期建议)
|
|
214
|
-
- {该做的 Gap} —— 理由:{价值×可行性}
|
|
215
|
-
- ...
|
|
216
|
-
|
|
217
|
-
## Roadmap(后续版本)
|
|
218
|
-
- V{N+1}:{...}(依赖:{...})
|
|
219
|
-
- V{N+2}:{...}
|
|
220
215
|
|
|
221
216
|
## 下一步
|
|
222
|
-
|
|
217
|
+
要跟进哪个机会?说"转 PRD"或"继续规划"。
|
|
223
218
|
```
|
|
224
219
|
|
|
225
220
|
---
|
|
226
221
|
|
|
227
|
-
##
|
|
222
|
+
## 【第 3 段】出结论 + 衔接(所有路径必经)
|
|
228
223
|
|
|
229
|
-
|
|
224
|
+
无论走的是 clarify 直接对齐(B 路径)还是 clarify+research(A 路径),
|
|
225
|
+
最后都要:
|
|
226
|
+
1. 把**对齐的需求**(+可选调研结论)整理成简短结论(1 段话 + 要点)
|
|
227
|
+
2. 问用户:"转 PRD 落地?还是先做规划(roadmap)?还是就到这?"
|
|
230
228
|
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
229
|
+
### 如果用户要规划 → plan 段(Gap + roadmap)
|
|
230
|
+
1. 现状(context_pack) vs 理想态(用户描述/research 结论) 建 Gap 表
|
|
231
|
+
2. Gap 按**业务价值 × 可行性**打分排序
|
|
232
|
+
3. 拆 MVP(本期人力能做完的) + Roadmap(后续版本,标依赖)
|
|
233
|
+
4. **与用户确认** Gap 表 + MVP + roadmap
|
|
234
|
+
5. 存 `workspace/members/{dev}/drafts/insight-plan-{topic}-{date}.md`
|
|
234
235
|
|
|
235
|
-
|
|
236
|
+
### 如果用户要转 PRD
|
|
237
|
+
提示:
|
|
236
238
|
```
|
|
237
|
-
/wl-prd-full
|
|
239
|
+
要落地?说"转 PRD"我把它作为现状输入,进 /wl-prd-full 参考模式落地成可执行 PRD。
|
|
238
240
|
```
|
|
239
|
-
|
|
240
|
-
- prd 读取 insight 报告作为**现状背景输入**
|
|
241
|
-
- prd 走"轻反思 + 批量确认 + 3 道质量锁"落地成 PRD + 原型
|
|
242
|
-
- **insight 不直接生成 PRD**,探索和落地是两道工序
|
|
241
|
+
用户说"转 PRD" → 触发 `/wl-prd-full 参考:{报告路径}`
|
|
243
242
|
|
|
244
243
|
---
|
|
245
244
|
|
|
246
|
-
## 🛡️
|
|
245
|
+
## 🛡️ 故障降级表
|
|
247
246
|
|
|
248
247
|
| 故障现象 | 检测信号 | 降级动作 | 绝不能 |
|
|
249
248
|
|---------|---------|---------|--------|
|
|
250
|
-
| **context_pack
|
|
251
|
-
| **web
|
|
252
|
-
| **多 agent 派发失败** | Agent 工具不可用 |
|
|
253
|
-
|
|
|
254
|
-
| **平台没指定** | 用户没说 web/app |
|
|
255
|
-
|
|
|
256
|
-
| **用户对结论全盘否定** | 用户说"不对" | 回到第 1 步重新锚定现状,问"哪里理解偏了",最多 2 轮重做 | ❌ 无限循环 / ❌ 强行写报告 |
|
|
249
|
+
| **context_pack 零命中** | 返回"(无命中)" | clarify 照做,现状段标"索引无先例,基于用户口述" | ❌ 编现状细节 |
|
|
250
|
+
| **web 搜索失败** | Agent 返回空 | 标"外部调研暂不可用,基于内部信息";或问用户跳过调研 | ❌ 凭训练记忆编竞品数据 |
|
|
251
|
+
| **多 agent 派发失败** | Agent 工具不可用 | 改单线程串行调研(主 agent 自己跑 WebSearch) | ❌ 因此中断 |
|
|
252
|
+
| **原型生成失败** | 脚本报错 | 回退到第①级文字对焦,标"原型暂不可用" | ❌ 卡住不前 |
|
|
253
|
+
| **平台没指定** | 用户没说 web/app | clarify 阶段**不强制问平台**(对焦时不关键);出原型时**必须问**(原型风格依赖平台) | ❌ 出错风格的原型 |
|
|
254
|
+
| **用户对结论全盘否定** | 用户说"不对" | 回 clarify 第①级重新对焦,问"哪里理解偏了" | ❌ 无限循环 / ❌ 强行出报告 |
|
|
257
255
|
|
|
258
256
|
---
|
|
259
257
|
|
|
260
|
-
##
|
|
258
|
+
## 鲁棒性清单(出结论前自检)
|
|
261
259
|
|
|
262
|
-
- [ ]
|
|
263
|
-
- [ ]
|
|
264
|
-
- [ ]
|
|
265
|
-
- [ ]
|
|
266
|
-
- [ ]
|
|
267
|
-
- [ ] 报告末尾给了"转 PRD"提示吗?
|
|
260
|
+
- [ ] clarify 真的对齐了吗?(用户明确确认过,不是 AI 单方面认定)
|
|
261
|
+
- [ ] 调研是用户**同意做**才做的吗?(不是擅自深挖)
|
|
262
|
+
- [ ] 每个发现/Gap 都附了**证据来源**?
|
|
263
|
+
- [ ] research 的中间产物 `research-agent-*.md` 清理了吗?
|
|
264
|
+
- [ ] 原型(如果出了)标注了"对焦草图,非交付"了吗?
|
|
268
265
|
|
|
269
266
|
---
|
|
270
267
|
|
|
271
268
|
## How to Use Results
|
|
272
269
|
|
|
273
|
-
|
|
270
|
+
洞察结论可流转:**说"转 PRD" → /wl-prd-full 参考模式**(把对齐的需求作为现状输入落地)。
|
|
274
271
|
|
|
275
|
-
> insight
|
|
272
|
+
> insight 是对焦/探索站,prd 是落地站。两者分开,思路才不混。
|
|
273
|
+
> **insight 绝不直接生成 PRD。** 即便出了对焦原型,也不进 PRD 链路(除非用户强烈要求)。
|
|
@@ -16,7 +16,7 @@ User input: $ARGUMENTS
|
|
|
16
16
|
```bash
|
|
17
17
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
18
18
|
```
|
|
19
|
-
> 后续脚本统一用 `python "$R/.qoder/scripts/
|
|
19
|
+
> 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`;所有仓库内相对路径(workspace/、data/code/)都前置 `"$R/"`。
|
|
20
20
|
|
|
21
21
|
## CRITICAL: Data Isolation
|
|
22
22
|
|
|
@@ -44,7 +44,7 @@ This name is used to filter ALL data below.
|
|
|
44
44
|
### 2. My Tasks (workspace/tasks/)
|
|
45
45
|
```bash
|
|
46
46
|
# Find tasks where creator OR assignee = current developer
|
|
47
|
-
python "$R/.qoder/scripts/task.py" list --mine
|
|
47
|
+
python "$R/.qoder/scripts/task/task.py" list --mine
|
|
48
48
|
```
|
|
49
49
|
Only show tasks where task.json has:
|
|
50
50
|
- `creator` == current developer, OR
|
|
@@ -102,7 +102,7 @@ Output:
|
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
Save to: workspace/members/{developer}/journal/daily-{date}.md
|
|
105
|
-
Then auto-sync (user never touches git): `python "$R/.qoder/scripts/team_sync.py" push`
|
|
105
|
+
Then auto-sync (user never touches git): `python "$R/.qoder/scripts/task/team_sync.py" push`
|
|
106
106
|
|
|
107
107
|
---
|
|
108
108
|
|
|
@@ -151,7 +151,7 @@ Output:
|
|
|
151
151
|
```
|
|
152
152
|
|
|
153
153
|
Save to: workspace/members/{developer}/journal/weekly-{week}.md
|
|
154
|
-
Then auto-sync (user never touches git): `python "$R/.qoder/scripts/team_sync.py" push`
|
|
154
|
+
Then auto-sync (user never touches git): `python "$R/.qoder/scripts/task/team_sync.py" push`
|
|
155
155
|
|
|
156
156
|
---
|
|
157
157
|
|
|
@@ -16,7 +16,7 @@ User input: $ARGUMENTS (default: show current status)
|
|
|
16
16
|
```bash
|
|
17
17
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
18
18
|
```
|
|
19
|
-
> 后续脚本统一用 `python "$R/.qoder/scripts/
|
|
19
|
+
> 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`;仓库内相对路径都前置 `"$R/"`。
|
|
20
20
|
|
|
21
21
|
## Scopes
|
|
22
22
|
- (no arg or "current") -> Current sprint status
|
|
@@ -69,7 +69,7 @@ Calculate from:
|
|
|
69
69
|
| EVA quality trend | 25% | tail .qoder/learning/eval-history.jsonl (avg score_pct, target >=80) |
|
|
70
70
|
| Index freshness | 20% | data/index/.index-meta.json last_sync (<=7 days) + verify checks |
|
|
71
71
|
| On-time delivery | 20% | task completion dates |
|
|
72
|
-
| Sync health | 15% | python "$R/.qoder/scripts/team_sync.py" status (ahead/behind/dirty) |
|
|
72
|
+
| Sync health | 15% | python "$R/.qoder/scripts/task/team_sync.py" status (ahead/behind/dirty) |
|
|
73
73
|
| Pipeline flow | 10% | PRD->Spec->Code conversion |
|
|
74
74
|
| Learning growth | 10% | learning/patterns/ entries |
|
|
75
75
|
|
|
@@ -16,7 +16,7 @@ User input: $ARGUMENTS
|
|
|
16
16
|
```bash
|
|
17
17
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
18
18
|
```
|
|
19
|
-
> 后续脚本统一用 `python "$R/.qoder/scripts/
|
|
19
|
+
> 后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`。
|
|
20
20
|
|
|
21
21
|
## Step 1: Load Spec
|
|
22
22
|
|
|
@@ -26,7 +26,7 @@ Read the spec file to understand requirements.
|
|
|
26
26
|
|
|
27
27
|
## Step 2: Search Related Code
|
|
28
28
|
|
|
29
|
-
Run: python "$R/.qoder/scripts/search_index.py" <keyword>
|
|
29
|
+
Run: python "$R/.qoder/scripts/kg/search_index.py" <keyword>
|
|
30
30
|
Find existing code that this implementation relates to.
|
|
31
31
|
Read relevant files for context.
|
|
32
32
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-design
|
|
3
|
-
description: "
|
|
3
|
+
description: "设计工序入口: import 录入设计稿→spec.json(默认) / generate 按设计spec出原型 / review 评审原型。"
|
|
4
4
|
argument-hint: "[预览|扫描|评审] <蓝湖链接或功能名>"
|
|
5
5
|
auto-approve: true
|
|
6
6
|
allowed-tools: [Read, Glob, Grep, Bash, Write, Edit, mcp__qoder-knowledge-graph, mcp__lanhu, mcp__qoder-mysql]
|
|
@@ -121,5 +121,5 @@ mcp__qoder-knowledge-graph__context_pack(keyword='<功能名>', platform='web')
|
|
|
121
121
|
|
|
122
122
|
评审输出后,记录到 learning:
|
|
123
123
|
```bash
|
|
124
|
-
python "$R/.qoder/scripts/learn.py" record review_done "{\"target\":\"$feature\",\"result\":\"$pass_or_issues\"}"
|
|
124
|
+
python "$R/.qoder/scripts/report/learn.py" record review_done "{\"target\":\"$feature\",\"result\":\"$pass_or_issues\"}"
|
|
125
125
|
```
|
|
@@ -19,7 +19,7 @@ Usage:
|
|
|
19
19
|
```bash
|
|
20
20
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
21
21
|
```
|
|
22
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `python "$R/.qoder/scripts/
|
|
22
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。后续脚本统一用 `python "$R/.qoder/scripts/<子包>/<脚本>.py"`(子包: kg/build/test/setup/io)或 `python "$R/.qoder/scripts/wlkj.py" <命令>`。
|
|
23
23
|
|
|
24
24
|
## Engine: init_doctor.py (幂等, 增量, 永不重头再来)
|
|
25
25
|
|
|
@@ -28,7 +28,7 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
28
28
|
|
|
29
29
|
### Case 1: /wl-init (no arguments)
|
|
30
30
|
```bash
|
|
31
|
-
python "$R/.qoder/scripts/init_doctor.py"
|
|
31
|
+
python "$R/.qoder/scripts/setup/init_doctor.py"
|
|
32
32
|
```
|
|
33
33
|
Report the doctor's findings to the user in friendly language.
|
|
34
34
|
If it found fixable issues, ask: "发现 N 个问题,要我自动修复吗?"
|
|
@@ -36,7 +36,7 @@ then run with --fix.
|
|
|
36
36
|
|
|
37
37
|
### Case 2/3: /wl-init 小王 [pm]
|
|
38
38
|
```bash
|
|
39
|
-
python "$R/.qoder/scripts/init_doctor.py" --fix 小王 [pm]
|
|
39
|
+
python "$R/.qoder/scripts/setup/init_doctor.py" --fix 小王 [pm]
|
|
40
40
|
```
|
|
41
41
|
This single command does ALL of:
|
|
42
42
|
1. 注册/切换开发者 (.qoder/.developer, key=value 格式) + 个人空间目录
|
|
@@ -44,7 +44,7 @@ User input: $ARGUMENTS
|
|
|
44
44
|
|
|
45
45
|
### 取上下文(1 次调用取全 8 段)
|
|
46
46
|
```bash
|
|
47
|
-
python "$R/.qoder/scripts/context_pack.py" <业务词> --platform <web|app>
|
|
47
|
+
python "$R/.qoder/scripts/kg/context_pack.py" <业务词> --platform <web|app>
|
|
48
48
|
```
|
|
49
49
|
- 第 4 段 = 历史 PRD(防重复)
|
|
50
50
|
- 第 5 段 = 相关 API
|
|
@@ -58,7 +58,7 @@ python "$R/.qoder/scripts/context_pack.py" <业务词> --platform <web|app>
|
|
|
58
58
|
|
|
59
59
|
### 质量门禁
|
|
60
60
|
```bash
|
|
61
|
-
python "$R/.qoder/scripts/eval_prd.py" <prd.md> [原型.html]
|
|
61
|
+
python "$R/.qoder/scripts/report/eval_prd.py" <prd.md> [原型.html]
|
|
62
62
|
```
|
|
63
63
|
≥ 80% 才 PASS。完整模板见 `.qoder/templates/prd-full-template.md`。
|
|
64
64
|
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "需求管理: 看需求/看产出/发布"
|
|
3
|
+
argument-hint: "[REQ-ID] [发布]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# /wl-req 需求生命周期管理
|
|
7
|
+
|
|
8
|
+
> 一个需求的所有产出(PRD/原型/任务/规格)聚合在 REQ-ID 容器, 一条命令看全貌。
|
|
9
|
+
|
|
10
|
+
## 用法 (只需记 2 个姿势)
|
|
11
|
+
|
|
12
|
+
| 输入 | 做什么 |
|
|
13
|
+
|------|--------|
|
|
14
|
+
| `/wl-req` | 列出所有需求 (跨草稿/产出/历史桶) |
|
|
15
|
+
| `/wl-req REQ-2026-001` | 显示该需求的全部产出 |
|
|
16
|
+
| `/wl-req REQ-2026-001 发布` | 草稿→产出→发禅道 (一步到位) |
|
|
17
|
+
|
|
18
|
+
## 实现层
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
# 列需求
|
|
22
|
+
python "$R/.qoder/scripts/report/req.py"
|
|
23
|
+
|
|
24
|
+
# 看某需求全貌
|
|
25
|
+
python "$R/.qoder/scripts/report/req.py" REQ-2026-001
|
|
26
|
+
|
|
27
|
+
# 发布 (promote + publish)
|
|
28
|
+
python "$R/.qoder/scripts/report/req.py" REQ-2026-001 发布
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## 结构
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
workspace/members/{dev}/
|
|
35
|
+
├── drafts/2026/06/W26/REQ-2026-001/ ← 草稿(私有)
|
|
36
|
+
│ ├── prd.md
|
|
37
|
+
│ ├── prototype.html
|
|
38
|
+
│ └── tasks/
|
|
39
|
+
├── outputs/2026/06/W26/REQ-2026-001/ ← 产出(团队可见, 发布后)
|
|
40
|
+
│ └── exports/ (docx/pdf)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
时间桶(YYYY/MM/Ww)内建: 本周=活动区, 历史=过去的桶, 无独立 archive。
|