@hupan56/wlkj 3.2.0 → 3.3.1

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.
Files changed (130) hide show
  1. package/bin/cli.js +117 -0
  2. package/package.json +2 -2
  3. package/templates/.qoder/.runtime/hook-errors.log +4 -0
  4. package/templates/qoder/commands/optional/wl-insight.md +276 -276
  5. package/templates/qoder/commands/optional/wl-report.md +1 -1
  6. package/templates/qoder/commands/optional/wl-spec.md +13 -1
  7. package/templates/qoder/commands/optional/wl-status.md +14 -1
  8. package/templates/qoder/commands/wl-code.md +111 -4
  9. package/templates/qoder/commands/wl-commit.md +12 -1
  10. package/templates/qoder/commands/wl-design.md +69 -5
  11. package/templates/qoder/commands/wl-init.md +129 -102
  12. package/templates/qoder/commands/wl-prd.md +162 -6
  13. package/templates/qoder/commands/wl-search.md +106 -20
  14. package/templates/qoder/commands/wl-task.md +617 -613
  15. package/templates/qoder/commands/wl-test.md +20 -1
  16. package/templates/qoder/contracts/spec.md +4 -0
  17. package/templates/qoder/hooks/post-tool-use.py +71 -0
  18. package/templates/qoder/hooks/pre-tool-use.py +136 -0
  19. package/templates/qoder/hooks/session-start.py +365 -397
  20. package/templates/qoder/scripts/capability/__pycache__/__init__.cpython-39.pyc +0 -0
  21. package/templates/qoder/scripts/capability/__pycache__/present_html.cpython-39.pyc +0 -0
  22. package/templates/qoder/scripts/capability/__pycache__/registry.cpython-39.pyc +0 -0
  23. package/templates/qoder/scripts/capability/__pycache__/registry_mcp.cpython-39.pyc +0 -0
  24. package/templates/qoder/scripts/capability/adapters/__init__.py +1 -1
  25. package/templates/qoder/scripts/capability/adapters/__pycache__/__init__.cpython-39.pyc +0 -0
  26. package/templates/qoder/scripts/capability/adapters/__pycache__/cli.cpython-39.pyc +0 -0
  27. package/templates/qoder/scripts/capability/adapters/__pycache__/mcp.cpython-39.pyc +0 -0
  28. package/templates/qoder/scripts/capability/adapters/__pycache__/qw.cpython-39.pyc +0 -0
  29. package/templates/qoder/scripts/capability/adapters/mcp.py +76 -100
  30. package/templates/qoder/scripts/capability/adapters/qw.py +295 -295
  31. package/templates/qoder/scripts/capability/caps/__init__.py +5 -5
  32. package/templates/qoder/scripts/capability/caps/__pycache__/__init__.cpython-39.pyc +0 -0
  33. package/templates/qoder/scripts/capability/caps/__pycache__/context.cpython-39.pyc +0 -0
  34. package/templates/qoder/scripts/capability/caps/__pycache__/cron.cpython-39.pyc +0 -0
  35. package/templates/qoder/scripts/capability/caps/__pycache__/identity.cpython-39.pyc +0 -0
  36. package/templates/qoder/scripts/capability/caps/__pycache__/memory.cpython-39.pyc +0 -0
  37. package/templates/qoder/scripts/capability/caps/__pycache__/notify.cpython-39.pyc +0 -0
  38. package/templates/qoder/scripts/capability/caps/__pycache__/present.cpython-39.pyc +0 -0
  39. package/templates/qoder/scripts/capability/caps/__pycache__/repo.cpython-39.pyc +0 -0
  40. package/templates/qoder/scripts/capability/caps/__pycache__/sandbox.cpython-39.pyc +0 -0
  41. package/templates/qoder/scripts/capability/caps/memory.py +1 -1
  42. package/templates/qoder/scripts/capability/caps/notify.py +64 -0
  43. package/templates/qoder/scripts/capability/caps/sandbox.py +38 -0
  44. package/templates/qoder/scripts/capability/present_html.py +68 -0
  45. package/templates/qoder/scripts/capability/registry.py +27 -25
  46. package/templates/qoder/scripts/capability/registry_mcp.py +67 -5
  47. package/templates/qoder/scripts/capability/smoke_test_report.json +34 -20
  48. package/templates/qoder/scripts/deployment/setup/carriers.py +3 -1
  49. package/templates/qoder/scripts/deployment/setup/init_doctor.py +10 -3
  50. package/templates/qoder/scripts/domain/__pycache__/__init__.cpython-39.pyc +0 -0
  51. package/templates/qoder/scripts/domain/integration/__init__.py +0 -0
  52. package/templates/qoder/scripts/domain/integration/__pycache__/__init__.cpython-39.pyc +0 -0
  53. package/templates/qoder/scripts/domain/integration/__pycache__/return_to_platform.cpython-39.pyc +0 -0
  54. package/templates/qoder/scripts/domain/integration/return_to_platform.py +395 -0
  55. package/templates/qoder/scripts/domain/integration/spec_upload.py +208 -0
  56. package/templates/qoder/scripts/domain/kg/build/kg_build.py +27 -3
  57. package/templates/qoder/scripts/domain/kg/extract/asset/__init__.py +10 -0
  58. package/templates/qoder/scripts/domain/kg/extract/asset/asset_tree.py +57 -0
  59. package/templates/qoder/scripts/domain/kg/extract/asset/discussion_importer.py +62 -0
  60. package/templates/qoder/scripts/domain/kg/extract/asset/prd_importer.py +146 -0
  61. package/templates/qoder/scripts/domain/kg/extract/asset/prototype_importer.py +64 -0
  62. package/templates/qoder/scripts/domain/kg/extract/asset/returns_importer.py +52 -0
  63. package/templates/qoder/scripts/domain/kg/extract/build_goal3.py +104 -0
  64. package/templates/qoder/scripts/domain/kg/extract/build_goal4.py +55 -0
  65. package/templates/qoder/scripts/domain/kg/extract/build_goal5.py +95 -0
  66. package/templates/qoder/scripts/domain/kg/extract/db/__init__.py +8 -0
  67. package/templates/qoder/scripts/domain/kg/extract/db/data_profile.py +22 -0
  68. package/templates/qoder/scripts/domain/kg/extract/db/fk_extractor.py +55 -0
  69. package/templates/qoder/scripts/domain/kg/extract/db/schema_extractor.py +90 -0
  70. package/templates/qoder/scripts/domain/kg/extract/extract.py +84 -0
  71. package/templates/qoder/scripts/domain/kg/extract/inference/__init__.py +9 -0
  72. package/templates/qoder/scripts/domain/kg/extract/inference/community_summarizer.py +206 -0
  73. package/templates/qoder/scripts/domain/kg/extract/inference/embed_builder.py +132 -0
  74. package/templates/qoder/scripts/domain/kg/extract/inference/naming_matcher.py +80 -0
  75. package/templates/qoder/scripts/domain/kg/extract/inference/promote.py +59 -0
  76. package/templates/qoder/scripts/domain/kg/extract/inference/recompute.py +93 -0
  77. package/templates/qoder/scripts/domain/kg/extract/inference/weak_link.py +421 -0
  78. package/templates/qoder/scripts/domain/kg/extract/java/__init__.py +15 -0
  79. package/templates/qoder/scripts/domain/kg/extract/java/_parser.py +271 -0
  80. package/templates/qoder/scripts/domain/kg/extract/java/all.py +145 -0
  81. package/templates/qoder/scripts/domain/kg/extract/java/build_java_to_pg.py +102 -0
  82. package/templates/qoder/scripts/domain/kg/extract/java/call_chain.py +49 -0
  83. package/templates/qoder/scripts/domain/kg/extract/java/class_extractor.py +141 -0
  84. package/templates/qoder/scripts/domain/kg/extract/java/domain_extractor.py +148 -0
  85. package/templates/qoder/scripts/domain/kg/extract/java/dubbo_extractor.py +33 -0
  86. package/templates/qoder/scripts/domain/kg/extract/java/endpoint_extractor.py +36 -0
  87. package/templates/qoder/scripts/domain/kg/extract/java/javadoc_extractor.py +110 -0
  88. package/templates/qoder/scripts/domain/kg/extract/java/llm_cn_filler.py +150 -0
  89. package/templates/qoder/scripts/domain/kg/extract/java/member_extractor.py +157 -0
  90. package/templates/qoder/scripts/domain/kg/extract/java/mybatisplus_extractor.py +34 -0
  91. package/templates/qoder/scripts/domain/kg/extract/java/pg_upsert.py +165 -0
  92. package/templates/qoder/scripts/domain/kg/extract/java/satoken_extractor.py +30 -0
  93. package/templates/qoder/scripts/domain/kg/extract/java/spring_extractor.py +39 -0
  94. package/templates/qoder/scripts/domain/kg/extract/java/validation_extractor.py +33 -0
  95. package/templates/qoder/scripts/domain/kg/extract/mybatis/__init__.py +9 -0
  96. package/templates/qoder/scripts/domain/kg/extract/mybatis/all.py +79 -0
  97. package/templates/qoder/scripts/domain/kg/extract/mybatis/mapper_parser.py +99 -0
  98. package/templates/qoder/scripts/domain/kg/extract/mybatis/relation_builder.py +69 -0
  99. package/templates/qoder/scripts/domain/kg/extract/mybatis/sql_extractor.py +78 -0
  100. package/templates/qoder/scripts/domain/kg/extract/prd/__init__.py +8 -0
  101. package/templates/qoder/scripts/domain/kg/extract/prd/prd_chunk_embed.py +105 -0
  102. package/templates/qoder/scripts/domain/kg/extract/prd/prd_llm_extract.py +153 -0
  103. package/templates/qoder/scripts/domain/kg/extract/prd/req_anchor.py +120 -0
  104. package/templates/qoder/scripts/domain/kg/graph/kg_semantic.py +4 -2
  105. package/templates/qoder/scripts/domain/kg/kg.py +42 -5
  106. package/templates/qoder/scripts/domain/kg/search/_remote.py +187 -0
  107. package/templates/qoder/scripts/domain/kg/search/context_pack.py +32 -2
  108. package/templates/qoder/scripts/domain/kg/search/search_index.py +74 -20
  109. package/templates/qoder/scripts/domain/kg/switch_project.py +158 -0
  110. package/templates/qoder/scripts/domain/kg/sync_repowiki.py +109 -0
  111. package/templates/qoder/scripts/domain/task/__pycache__/wlkj_panel.cpython-39.pyc +0 -0
  112. package/templates/qoder/scripts/domain/task/{zentao_panel.py → wlkj_panel.py} +315 -53
  113. package/templates/qoder/scripts/engine/poller.py +219 -0
  114. package/templates/qoder/scripts/foundation/__pycache__/__init__.cpython-39.pyc +0 -0
  115. package/templates/qoder/scripts/foundation/core/__pycache__/__init__.cpython-39.pyc +0 -0
  116. package/templates/qoder/scripts/foundation/core/__pycache__/paths.cpython-39.pyc +0 -0
  117. package/templates/qoder/scripts/foundation/integrations/active_task.py +2 -1
  118. package/templates/qoder/scripts/orchestration/wlkj.py +4 -0
  119. package/templates/qoder/scripts/protocol/__pycache__/__init__.cpython-39.pyc +0 -0
  120. package/templates/qoder/scripts/protocol/mcp/zentao_mcp_server.py +1 -1
  121. package/templates/qoder/scripts/protocol/transports/__pycache__/__init__.cpython-39.pyc +0 -0
  122. package/templates/qoder/scripts/protocol/transports/__pycache__/base.cpython-39.pyc +0 -0
  123. package/templates/qoder/scripts/protocol/transports/__pycache__/cli.cpython-39.pyc +0 -0
  124. package/templates/qoder/scripts/protocol/transports/__pycache__/http.cpython-39.pyc +0 -0
  125. package/templates/qoder/scripts/protocol/transports/__pycache__/stdio.cpython-39.pyc +0 -0
  126. package/templates/qoder/scripts/protocol/transports/http.py +7 -1
  127. package/templates/qoder/scripts/validation/metrics/__pycache__/present_board.cpython-39.pyc +0 -0
  128. package/templates/qoder/scripts/validation/metrics/present_board.py +180 -0
  129. package/templates/qoder/settings.json +10 -0
  130. package/templates/root/AGENTS.md +9 -10
@@ -1,276 +1,276 @@
1
- ---
2
- name: wl-insight
3
- description: "需求澄清对焦 + 可选调研 + 未来规划。流水线的'上游探索站'。最高频场景:用户描述模糊/产品听不懂时,快速对焦(必要时出原型图帮助理解),对齐后再问要不要调研/规划。把'到底要什么'想清楚,结论交给 /wl-prd 落地。"
4
- argument-hint: "[主题]"
5
- auto-approve: true
6
- allowed-tools: [Read, Glob, Grep, Bash, Write, Edit, Agent, WebSearch]
7
- ---
8
-
9
- # /wl-insight - 需求澄清对焦(默认)/ 调研 / 规划
10
-
11
- User input: $ARGUMENTS
12
-
13
- > **流水线的上游探索站**。但"上游探索"不是一股脑深挖——
14
- > **最高频的场景是:产品听不懂用户在说什么,需要快速对焦**。
15
- >
16
- > **核心原则:让用户听懂,不在于简短。**
17
- > 听不懂就升级手段(文字→原型),直到对齐。
18
- > 每一步都停下来等用户确认,绝不擅自往下深挖。
19
-
20
- ---
21
-
22
- ## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
23
-
24
- **先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
25
- ```bash
26
- R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
27
- PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
28
- ```
29
- > 后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
30
-
31
- ---
32
-
33
- ## 🔒 语言锁(最高优先级)
34
-
35
- **全部输出必须简体中文。** 含理解复述、原型标注、结论、建议。
36
- 禁止任何英文句子(技术专有名词如 MCP/JTBD/Kano 可保留英文缩写)。
37
-
38
- ---
39
-
40
- ## STEP 0: 路由(看用户说了什么 / 没说什么)
41
-
42
- | 信号 | 走哪段 | 说明 |
43
- |------|--------|------|
44
- | **任何输入**(含无主题)/ "听不懂""不确定""他说的是啥" / 模糊描述 | **【默认】clarify 对焦** | 最高频,最高优先级。先对焦,别急着分析 |
45
- | "调研竞品""对标 XX""行业都怎么做""看看别人" | research 调研 | **但即便用户主动说调研,也先 clarify 确认要调研的是什么** |
46
- | "接下来做什么""下个版本""路线图""MVP 范围""规划" | plan 规划 | 同上,先对齐现状再规划 |
47
-
48
- > ⚠️ **路由铁律:clarify 是必经的第一段。** 即便用户说"调研竞品",
49
- > 也要先 30 秒确认"你要调研的这个东西,我理解对了吗?"。
50
- > 一股脑直接深挖 = 失败。
51
-
52
- ---
53
-
54
- ## 🔒 通用前置(所有段必做)
55
-
56
- 1. **身份**:读 `.qoder/.developer`,缺失 → 停下提示 `/wl-init`
57
- 2. **现状锚点**:`$PY "$R/.qoder/scripts/orchestration/wlkj.py" context <关键词> --platform <web|app>`(必跑,秒级)
58
- 3. **历史参考**:扫 `data/docs/prd/` 看已做过的,扫历史 insight 报告看是否聊过
59
-
60
- ---
61
-
62
- ## 【默认段】clarify(需求澄清对焦)—— 三级升级
63
-
64
- **目标:让用户听懂"产品对他的需求的理解",并对齐。不在于简短,在于听懂。**
65
- **听不懂就升级手段,直到对齐为止。**
66
-
67
- ### 升级阶梯(从①开始,听懂了就停,不越级)
68
-
69
- #### 第①级:文字对焦(默认起点)
70
-
71
- 跑 context_pack 秒扫现状后,**立刻**输出给用户看:
72
-
73
- ```
74
- 我理解你要的是:
75
- ① {一句话复述需求的核心}
76
- ② {如果有第二层,补充}
77
-
78
- 现状:
79
- - {项目里已有什么,context_pack 命中: 文件/模块}
80
- - {还没有什么}
81
-
82
- 我拿不准的点(请逐条确认/纠正):
83
- Q1. {第一个不确定的细节} → 你的意思是 A 还是 B?
84
- Q2. {第二个} → ?
85
- Q3. {第三个} → ?
86
-
87
- 你看我理解对了吗?哪条偏了?
88
- ```
89
-
90
- → **停。等用户回答。** 别往下走。
91
- → 用户确认对齐了 → 进【第 2 段:问要不要调研】
92
- → 用户说"还是没懂"或反复说不清 → 进第②级
93
-
94
- #### 第②级:文字说不明白 → 快速原型图(对齐工具,不是产出)
95
-
96
- **当文字反复解释用户仍听不懂/拿不准时,出一张原型图当"视觉问句"。**
97
- 用项目真实风格,让用户直观看到"你想要的是不是大概这样":
98
-
99
- ```bash
100
- # Web 管理端
101
- $PY "$R/.qoder/scripts/orchestration/wlkj.py" fill-prototype "<刚才对焦到的业务关键词>" --platform web
102
- # APP 移动端
103
- $PY "$R/.qoder/scripts/orchestration/wlkj.py" fill-prototype "<刚才对焦到的业务关键词>" --platform app
104
- ```
105
- > fill-prototype 会按 platform 自动选 prototype-web.html / prototype-app.html 模板,
106
- > 用知识图谱里的真实字段/组件把模板填满, 输出到 drafts/。
107
-
108
- 原型要求:
109
- - **项目真实风格**(Web=Vben Admin+Ant Design / App=Vant),不是草稿线框图
110
- - **聚焦你要对焦的那一个点**(不是完整功能,是对焦用的最小可视)
111
- - 用真实图标系统(`data/index/icon-reference.json`),**绝不 emoji**
112
- - 标注清楚:"这是帮你确认理解的草图,不是最终设计"
113
-
114
- 给用户看时说:
115
- ```
116
- 为了确认我理解对了,出了张草图(用咱们项目风格):
117
- {原型路径}
118
-
119
- 你想要的是不是大概这样?哪里不对?
120
- ```
121
-
122
- ⚠️ **这个原型是"沟通草稿",不进 PRD,不入 team_sync,不归档。**
123
- 它是即用即弃的对焦工具,就像白板上画的图。
124
- **除非用户强烈说"这个挺好,留下进 PRD"** → 才提示转 `/wl-design` 走正式原型链路。
125
-
126
- → 用户看懂并确认 → 进【第 2 段】
127
- → 用户看了还是不懂/方向不对 → 进第③级
128
-
129
- #### 第③级:兜底 —— 回到现状深挖重解释
130
-
131
- 极少数情况:原型也说不通。说明对现状的理解有偏差。
132
- - 重跑 context_pack,**换关键词**,深挖用户提的模块到底怎么运作
133
- - 把"现状到底是怎么回事"用最朴素的话重新讲一遍
134
- - 问用户:"是我对现状理解错了,还是你要的跟现状差很远?"
135
- - 最多 2 轮,然后请用户用他自己的话再描述一次需求
136
-
137
- ---
138
-
139
- ## 【第 2 段】对齐后:问要不要调研(必须问,不擅自做)
140
-
141
- **clarify 对齐后,不要直接一股脑做调研。问用户要不要。**
142
-
143
- ```
144
- 需求对齐了 👍
145
-
146
- 接下来要不要我做外部调研?(看看竞品/行业怎么做,给咱们参考)
147
- A. 要调研 —— 我派几个 agent 并行去看(竞品对标/技术方案/用户场景),
148
- 大概 X 分钟,产出调研报告
149
- B. 不用调研,需求清楚了直接往下走
150
-
151
- 选 A 还是 B?
152
- ```
153
-
154
- → **用户选 A** → 进 research 段(派多 agent)
155
- → **用户选 B** → 直接进【第 3 段:出结论 + 衔接】
156
-
157
- > 这一步的存在意义:调研耗时,且很多时候用户心里已经有数(只是没说清楚)。
158
- > 强行调研 = 浪费时间。**把"要不要调研"的决定权还给用户。**
159
-
160
- ---
161
-
162
- ## research 段(仅当用户选 A)—— 多 agent 调研
163
-
164
- **目标**:用成熟方法论框架,对标外部,给已对齐的需求提供外部参考。
165
-
166
- ### 方法论框架(每个 agent 按视角选合适的)
167
- - **竞品对标** → 竞品矩阵(功能对比表) + 差异化机会
168
- - **技术方案** → 技术选型对比(方案A vs B,成本/风险/成熟度)
169
- - **用户场景** → JTBD("用户在完成什么 job")+ Kano(基础/期望/兴奋需求分类)
170
- - **行业趋势** → 趋势时间线 + 机会窗口
171
-
172
- ### 流程(目标 4-6 轮)
173
-
174
- **第 1 步|确定调研视角**(2-4 个,按主题选)
175
- **第 2 步|并行派多 agent**(核心)
176
- **同一条消息**派 2-4 个 Agent,每个一个视角 + 一个方法论框架,并发跑:
177
- ```
178
- 每个 Agent 的任务:
179
- - 视角:{竞品对标/技术方案/用户场景/行业趋势}
180
- - 方法论:{对应框架,见上}
181
- - 用 WebSearch 搜 3-5 个权威源(官方文档/行业报告/技术博客/公开案例)
182
- - 写中间产物:workspace/members/{dev}/drafts/research-agent-{N}-{视角}.md
183
- - 含:关键发现 / 对本项目的启发 / Gap 信号(外部做得好而我们没做的) / 来源链接
184
- ```
185
- > 派 Agent 时给**具体的视角描述 + 方法论 + 本项目现状摘要**,让调研有针对性。
186
-
187
- **第 3 步|合并 + Gap 提取**
188
- 1. 读所有 `research-agent-*.md`
189
- 2. 合并成一份调研报告,按视角组织
190
- 3. 对每个发现标:**本项目现状 vs 外部做法 → Gap**
191
- 4. 列"机会信号"
192
-
193
- **第 4 步|清理中间产物 + 与用户确认 + 出报告**
194
- ```bash
195
- rm -f workspace/members/{dev}/drafts/research-agent-*.md
196
- ```
197
- 1. 把调研发现 + Gap + 机会信号**一次性编号列清**
198
- 2. 问:"这个调研对吗?哪个机会值得跟进?"
199
- 3. 确认后写报告
200
-
201
- ### 输出结构
202
- ```markdown
203
- # 外部调研 - {主题}({date})
204
-
205
- ## 调研视角与方法
206
- {本次派了哪几个视角,各用什么方法论}
207
-
208
- ## 现状锚定
209
- {context_pack 摘要}
210
-
211
- ## 调研发现(按视角)
212
- ### 视角 1:竞品对标(竞品矩阵)
213
- | 竞品 | 做法摘要 | 我们的 Gap | 来源 |
214
- ...
215
-
216
- ## 机会信号
217
- 1. {外部做得好而我们没做的}
218
-
219
- ## 下一步
220
- 要跟进哪个机会?说"转 PRD"或"继续规划"。
221
- ```
222
-
223
- ---
224
-
225
- ## 【第 3 段】出结论 + 衔接(所有路径必经)
226
-
227
- 无论走的是 clarify 直接对齐(B 路径)还是 clarify+research(A 路径),
228
- 最后都要:
229
- 1. 把**对齐的需求**(+可选调研结论)整理成简短结论(1 段话 + 要点)
230
- 2. 问用户:"转 PRD 落地?还是先做规划(roadmap)?还是就到这?"
231
-
232
- ### 如果用户要规划 → plan 段(Gap + roadmap)
233
- 1. 现状(context_pack) vs 理想态(用户描述/research 结论) 建 Gap 表
234
- 2. Gap 按**业务价值 × 可行性**打分排序
235
- 3. 拆 MVP(本期人力能做完的) + Roadmap(后续版本,标依赖)
236
- 4. **与用户确认** Gap 表 + MVP + roadmap
237
- 5. 存 `workspace/members/{dev}/drafts/insight-plan-{topic}-{date}.md`
238
-
239
- ### 如果用户要转 PRD
240
- 提示:
241
- ```
242
- 要落地?说"转 PRD"我把它作为现状输入,进 /wl-prd 参考模式落地成可执行 PRD。
243
- ```
244
- 用户说"转 PRD" → 触发 `/wl-prd 参考:{报告路径}`
245
-
246
- ---
247
-
248
- ## 🛡️ 故障降级表
249
-
250
- | 故障现象 | 检测信号 | 降级动作 | 绝不能 |
251
- |---------|---------|---------|--------|
252
- | **context_pack 零命中** | 返回"(无命中)" | clarify 照做,现状段标"索引无先例,基于用户口述" | ❌ 编现状细节 |
253
- | **web 搜索失败** | Agent 返回空 | 标"外部调研暂不可用,基于内部信息";或问用户跳过调研 | ❌ 凭训练记忆编竞品数据 |
254
- | **多 agent 派发失败** | Agent 工具不可用 | 改单线程串行调研(主 agent 自己跑 WebSearch) | ❌ 因此中断 |
255
- | **原型生成失败** | 脚本报错 | 回退到第①级文字对焦,标"原型暂不可用" | ❌ 卡住不前 |
256
- | **平台没指定** | 用户没说 web/app | clarify 阶段**不强制问平台**(对焦时不关键);出原型时**必须问**(原型风格依赖平台) | ❌ 出错风格的原型 |
257
- | **用户对结论全盘否定** | 用户说"不对" | 回 clarify 第①级重新对焦,问"哪里理解偏了" | ❌ 无限循环 / ❌ 强行出报告 |
258
-
259
- ---
260
-
261
- ## 鲁棒性清单(出结论前自检)
262
-
263
- - [ ] clarify 真的对齐了吗?(用户明确确认过,不是 AI 单方面认定)
264
- - [ ] 调研是用户**同意做**才做的吗?(不是擅自深挖)
265
- - [ ] 每个发现/Gap 都附了**证据来源**?
266
- - [ ] research 的中间产物 `research-agent-*.md` 清理了吗?
267
- - [ ] 原型(如果出了)标注了"对焦草图,非交付"了吗?
268
-
269
- ---
270
-
271
- ## How to Use Results
272
-
273
- 洞察结论可流转:**说"转 PRD" → /wl-prd 参考模式**(把对齐的需求作为现状输入落地)。
274
-
275
- > insight 是对焦/探索站,prd 是落地站。两者分开,思路才不混。
276
- > **insight 绝不直接生成 PRD。** 即便出了对焦原型,也不进 PRD 链路(除非用户强烈要求)。
1
+ ---
2
+ name: wl-insight
3
+ description: "需求上游探索站。默认澄清(产品听不懂时对焦,必要时出原型帮理解); discover(发现机会) / research(调研竞品) / plan(规划roadmap)。说'转PRD'落地。"
4
+ argument-hint: "[主题]"
5
+ auto-approve: true
6
+ allowed-tools: [Read, Glob, Grep, Bash, Write, Edit, Agent, WebSearch]
7
+ ---
8
+
9
+ # /wl-insight - 需求澄清对焦(默认)/ 调研 / 规划
10
+
11
+ User input: $ARGUMENTS
12
+
13
+ > **流水线的上游探索站**。但"上游探索"不是一股脑深挖——
14
+ > **最高频的场景是:产品听不懂用户在说什么,需要快速对焦**。
15
+ >
16
+ > **核心原则:让用户听懂,不在于简短。**
17
+ > 听不懂就升级手段(文字→原型),直到对齐。
18
+ > 每一步都停下来等用户确认,绝不擅自往下深挖。
19
+
20
+ ---
21
+
22
+ ## 🔧 环境自检(QoderWork 桌面端 vs Qoder IDE/CLI)
23
+
24
+ **先确定仓库根 R**(QoderWork 桌面端工作目录不是仓库根,相对路径会失效):
25
+ ```bash
26
+ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null || python3 ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
27
+ PY=$(python --version >/dev/null 2>&1 && echo python || echo python3)
28
+ ```
29
+ > 后续脚本统一用 `$PY "$R/.qoder/scripts/orchestration/wlkj.py" <命令>`。
30
+
31
+ ---
32
+
33
+ ## 🔒 语言锁(最高优先级)
34
+
35
+ **全部输出必须简体中文。** 含理解复述、原型标注、结论、建议。
36
+ 禁止任何英文句子(技术专有名词如 MCP/JTBD/Kano 可保留英文缩写)。
37
+
38
+ ---
39
+
40
+ ## STEP 0: 路由(看用户说了什么 / 没说什么)
41
+
42
+ | 信号 | 走哪段 | 说明 |
43
+ |------|--------|------|
44
+ | **任何输入**(含无主题)/ "听不懂""不确定""他说的是啥" / 模糊描述 | **【默认】clarify 对焦** | 最高频,最高优先级。先对焦,别急着分析 |
45
+ | "调研竞品""对标 XX""行业都怎么做""看看别人" | research 调研 | **但即便用户主动说调研,也先 clarify 确认要调研的是什么** |
46
+ | "接下来做什么""下个版本""路线图""MVP 范围""规划" | plan 规划 | 同上,先对齐现状再规划 |
47
+
48
+ > ⚠️ **路由铁律:clarify 是必经的第一段。** 即便用户说"调研竞品",
49
+ > 也要先 30 秒确认"你要调研的这个东西,我理解对了吗?"。
50
+ > 一股脑直接深挖 = 失败。
51
+
52
+ ---
53
+
54
+ ## 🔒 通用前置(所有段必做)
55
+
56
+ 1. **身份**:读 `.qoder/.developer`,缺失 → 停下提示 `/wl-init`
57
+ 2. **现状锚点**:`$PY "$R/.qoder/scripts/orchestration/wlkj.py" context <关键词> --platform <web|app>`(必跑,秒级)
58
+ 3. **历史参考**:扫 `data/docs/prd/` 看已做过的,扫历史 insight 报告看是否聊过
59
+
60
+ ---
61
+
62
+ ## 【默认段】clarify(需求澄清对焦)—— 三级升级
63
+
64
+ **目标:让用户听懂"产品对他的需求的理解",并对齐。不在于简短,在于听懂。**
65
+ **听不懂就升级手段,直到对齐为止。**
66
+
67
+ ### 升级阶梯(从①开始,听懂了就停,不越级)
68
+
69
+ #### 第①级:文字对焦(默认起点)
70
+
71
+ 跑 context_pack 秒扫现状后,**立刻**输出给用户看:
72
+
73
+ ```
74
+ 我理解你要的是:
75
+ ① {一句话复述需求的核心}
76
+ ② {如果有第二层,补充}
77
+
78
+ 现状:
79
+ - {项目里已有什么,context_pack 命中: 文件/模块}
80
+ - {还没有什么}
81
+
82
+ 我拿不准的点(请逐条确认/纠正):
83
+ Q1. {第一个不确定的细节} → 你的意思是 A 还是 B?
84
+ Q2. {第二个} → ?
85
+ Q3. {第三个} → ?
86
+
87
+ 你看我理解对了吗?哪条偏了?
88
+ ```
89
+
90
+ → **停。等用户回答。** 别往下走。
91
+ → 用户确认对齐了 → 进【第 2 段:问要不要调研】
92
+ → 用户说"还是没懂"或反复说不清 → 进第②级
93
+
94
+ #### 第②级:文字说不明白 → 快速原型图(对齐工具,不是产出)
95
+
96
+ **当文字反复解释用户仍听不懂/拿不准时,出一张原型图当"视觉问句"。**
97
+ 用项目真实风格,让用户直观看到"你想要的是不是大概这样":
98
+
99
+ ```bash
100
+ # Web 管理端
101
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" fill-prototype "<刚才对焦到的业务关键词>" --platform web
102
+ # APP 移动端
103
+ $PY "$R/.qoder/scripts/orchestration/wlkj.py" fill-prototype "<刚才对焦到的业务关键词>" --platform app
104
+ ```
105
+ > fill-prototype 会按 platform 自动选 prototype-web.html / prototype-app.html 模板,
106
+ > 用知识图谱里的真实字段/组件把模板填满, 输出到 drafts/。
107
+
108
+ 原型要求:
109
+ - **项目真实风格**(Web=Vben Admin+Ant Design / App=Vant),不是草稿线框图
110
+ - **聚焦你要对焦的那一个点**(不是完整功能,是对焦用的最小可视)
111
+ - 用真实图标系统(`data/index/icon-reference.json`),**绝不 emoji**
112
+ - 标注清楚:"这是帮你确认理解的草图,不是最终设计"
113
+
114
+ 给用户看时说:
115
+ ```
116
+ 为了确认我理解对了,出了张草图(用咱们项目风格):
117
+ {原型路径}
118
+
119
+ 你想要的是不是大概这样?哪里不对?
120
+ ```
121
+
122
+ ⚠️ **这个原型是"沟通草稿",不进 PRD,不入 team_sync,不归档。**
123
+ 它是即用即弃的对焦工具,就像白板上画的图。
124
+ **除非用户强烈说"这个挺好,留下进 PRD"** → 才提示转 `/wl-design` 走正式原型链路。
125
+
126
+ → 用户看懂并确认 → 进【第 2 段】
127
+ → 用户看了还是不懂/方向不对 → 进第③级
128
+
129
+ #### 第③级:兜底 —— 回到现状深挖重解释
130
+
131
+ 极少数情况:原型也说不通。说明对现状的理解有偏差。
132
+ - 重跑 context_pack,**换关键词**,深挖用户提的模块到底怎么运作
133
+ - 把"现状到底是怎么回事"用最朴素的话重新讲一遍
134
+ - 问用户:"是我对现状理解错了,还是你要的跟现状差很远?"
135
+ - 最多 2 轮,然后请用户用他自己的话再描述一次需求
136
+
137
+ ---
138
+
139
+ ## 【第 2 段】对齐后:问要不要调研(必须问,不擅自做)
140
+
141
+ **clarify 对齐后,不要直接一股脑做调研。问用户要不要。**
142
+
143
+ ```
144
+ 需求对齐了 👍
145
+
146
+ 接下来要不要我做外部调研?(看看竞品/行业怎么做,给咱们参考)
147
+ A. 要调研 —— 我派几个 agent 并行去看(竞品对标/技术方案/用户场景),
148
+ 大概 X 分钟,产出调研报告
149
+ B. 不用调研,需求清楚了直接往下走
150
+
151
+ 选 A 还是 B?
152
+ ```
153
+
154
+ → **用户选 A** → 进 research 段(派多 agent)
155
+ → **用户选 B** → 直接进【第 3 段:出结论 + 衔接】
156
+
157
+ > 这一步的存在意义:调研耗时,且很多时候用户心里已经有数(只是没说清楚)。
158
+ > 强行调研 = 浪费时间。**把"要不要调研"的决定权还给用户。**
159
+
160
+ ---
161
+
162
+ ## research 段(仅当用户选 A)—— 多 agent 调研
163
+
164
+ **目标**:用成熟方法论框架,对标外部,给已对齐的需求提供外部参考。
165
+
166
+ ### 方法论框架(每个 agent 按视角选合适的)
167
+ - **竞品对标** → 竞品矩阵(功能对比表) + 差异化机会
168
+ - **技术方案** → 技术选型对比(方案A vs B,成本/风险/成熟度)
169
+ - **用户场景** → JTBD("用户在完成什么 job")+ Kano(基础/期望/兴奋需求分类)
170
+ - **行业趋势** → 趋势时间线 + 机会窗口
171
+
172
+ ### 流程(目标 4-6 轮)
173
+
174
+ **第 1 步|确定调研视角**(2-4 个,按主题选)
175
+ **第 2 步|并行派多 agent**(核心)
176
+ **同一条消息**派 2-4 个 Agent,每个一个视角 + 一个方法论框架,并发跑:
177
+ ```
178
+ 每个 Agent 的任务:
179
+ - 视角:{竞品对标/技术方案/用户场景/行业趋势}
180
+ - 方法论:{对应框架,见上}
181
+ - 用 WebSearch 搜 3-5 个权威源(官方文档/行业报告/技术博客/公开案例)
182
+ - 写中间产物:workspace/members/{dev}/drafts/research-agent-{N}-{视角}.md
183
+ - 含:关键发现 / 对本项目的启发 / Gap 信号(外部做得好而我们没做的) / 来源链接
184
+ ```
185
+ > 派 Agent 时给**具体的视角描述 + 方法论 + 本项目现状摘要**,让调研有针对性。
186
+
187
+ **第 3 步|合并 + Gap 提取**
188
+ 1. 读所有 `research-agent-*.md`
189
+ 2. 合并成一份调研报告,按视角组织
190
+ 3. 对每个发现标:**本项目现状 vs 外部做法 → Gap**
191
+ 4. 列"机会信号"
192
+
193
+ **第 4 步|清理中间产物 + 与用户确认 + 出报告**
194
+ ```bash
195
+ rm -f workspace/members/{dev}/drafts/research-agent-*.md
196
+ ```
197
+ 1. 把调研发现 + Gap + 机会信号**一次性编号列清**
198
+ 2. 问:"这个调研对吗?哪个机会值得跟进?"
199
+ 3. 确认后写报告
200
+
201
+ ### 输出结构
202
+ ```markdown
203
+ # 外部调研 - {主题}({date})
204
+
205
+ ## 调研视角与方法
206
+ {本次派了哪几个视角,各用什么方法论}
207
+
208
+ ## 现状锚定
209
+ {context_pack 摘要}
210
+
211
+ ## 调研发现(按视角)
212
+ ### 视角 1:竞品对标(竞品矩阵)
213
+ | 竞品 | 做法摘要 | 我们的 Gap | 来源 |
214
+ ...
215
+
216
+ ## 机会信号
217
+ 1. {外部做得好而我们没做的}
218
+
219
+ ## 下一步
220
+ 要跟进哪个机会?说"转 PRD"或"继续规划"。
221
+ ```
222
+
223
+ ---
224
+
225
+ ## 【第 3 段】出结论 + 衔接(所有路径必经)
226
+
227
+ 无论走的是 clarify 直接对齐(B 路径)还是 clarify+research(A 路径),
228
+ 最后都要:
229
+ 1. 把**对齐的需求**(+可选调研结论)整理成简短结论(1 段话 + 要点)
230
+ 2. 问用户:"转 PRD 落地?还是先做规划(roadmap)?还是就到这?"
231
+
232
+ ### 如果用户要规划 → plan 段(Gap + roadmap)
233
+ 1. 现状(context_pack) vs 理想态(用户描述/research 结论) 建 Gap 表
234
+ 2. Gap 按**业务价值 × 可行性**打分排序
235
+ 3. 拆 MVP(本期人力能做完的) + Roadmap(后续版本,标依赖)
236
+ 4. **与用户确认** Gap 表 + MVP + roadmap
237
+ 5. 存 `workspace/members/{dev}/drafts/insight-plan-{topic}-{date}.md`
238
+
239
+ ### 如果用户要转 PRD
240
+ 提示:
241
+ ```
242
+ 要落地?说"转 PRD"我把它作为现状输入,进 /wl-prd 参考模式落地成可执行 PRD。
243
+ ```
244
+ 用户说"转 PRD" → 触发 `/wl-prd 参考:{报告路径}`
245
+
246
+ ---
247
+
248
+ ## 🛡️ 故障降级表
249
+
250
+ | 故障现象 | 检测信号 | 降级动作 | 绝不能 |
251
+ |---------|---------|---------|--------|
252
+ | **context_pack 零命中** | 返回"(无命中)" | clarify 照做,现状段标"索引无先例,基于用户口述" | ❌ 编现状细节 |
253
+ | **web 搜索失败** | Agent 返回空 | 标"外部调研暂不可用,基于内部信息";或问用户跳过调研 | ❌ 凭训练记忆编竞品数据 |
254
+ | **多 agent 派发失败** | Agent 工具不可用 | 改单线程串行调研(主 agent 自己跑 WebSearch) | ❌ 因此中断 |
255
+ | **原型生成失败** | 脚本报错 | 回退到第①级文字对焦,标"原型暂不可用" | ❌ 卡住不前 |
256
+ | **平台没指定** | 用户没说 web/app | clarify 阶段**不强制问平台**(对焦时不关键);出原型时**必须问**(原型风格依赖平台) | ❌ 出错风格的原型 |
257
+ | **用户对结论全盘否定** | 用户说"不对" | 回 clarify 第①级重新对焦,问"哪里理解偏了" | ❌ 无限循环 / ❌ 强行出报告 |
258
+
259
+ ---
260
+
261
+ ## 鲁棒性清单(出结论前自检)
262
+
263
+ - [ ] clarify 真的对齐了吗?(用户明确确认过,不是 AI 单方面认定)
264
+ - [ ] 调研是用户**同意做**才做的吗?(不是擅自深挖)
265
+ - [ ] 每个发现/Gap 都附了**证据来源**?
266
+ - [ ] research 的中间产物 `research-agent-*.md` 清理了吗?
267
+ - [ ] 原型(如果出了)标注了"对焦草图,非交付"了吗?
268
+
269
+ ---
270
+
271
+ ## How to Use Results
272
+
273
+ 洞察结论可流转:**说"转 PRD" → /wl-prd 参考模式**(把对齐的需求作为现状输入落地)。
274
+
275
+ > insight 是对焦/探索站,prd 是落地站。两者分开,思路才不混。
276
+ > **insight 绝不直接生成 PRD。** 即便出了对焦原型,也不进 PRD 链路(除非用户强烈要求)。
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wl-report
3
- description: "生成日报/周报,严格按当前开发者隔离。Generate daily/weekly work report, isolated by current developer. "
3
+ description: "日报/周报,按当前开发者隔离。默认日报(今天); 说'周报'出本周。数据源: 任务+禅道工时+提交+PRD+日历(可选增强)。"
4
4
  argument-hint: "[daily/weekly] or empty for auto-detect"
5
5
  auto-approve: true
6
6
  allowed-tools: [Read, Bash]
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wl-spec
3
- description: "从已确认 PRD 生成开发 Spec 文档(/wl-spec 命令入口)。Generate or review technical Spec from PRD + Design. "
3
+ description: "从已确认 PRD 生成开发 Spec(技术规格)。默认生成; review 评审现有 spec。/wl-code 按此 spec 实现。"
4
4
  argument-hint: "[review]"
5
5
  auto-approve: true
6
6
  allowed-tools: [Read, Glob, Grep, Bash, Write, Edit]
@@ -24,3 +24,15 @@ User input:
24
24
  ```
25
25
  5. Save to workspace/specs/ or workspace/tasks/{id}/spec.md
26
26
  6. Notify dev to review — 提示用户审阅后回复"确认",确认后改 `status: confirmed`
27
+ 7. ★ 用户确认后,上传 spec 到平台(按 zentao_id 反查需求挂载 → 资产中心随需求可见,无需发布):
28
+ ```bash
29
+ python -m domain.integration.spec_upload <spec.md> --zentao-id <禅道story号> [--code-targets CtrlA,SvcB]
30
+ ```
31
+ - 契约头无 `platform_spec_id` → `create_spec(zentao_id,...)` 新建 + 平台反查 Requirement 挂上 → `confirm_spec` 进 confirmed → 回写 `platform_spec_id`(幂等锚)
32
+ - 契约头有 `platform_spec_id` → 自动走 `update_spec`(version+1,不重复建)
33
+ 8. 改 spec 重确认 → 再跑第 7 步 → 平台 spec 多一版本(幂等)
34
+ 9. 上传失败只警告不阻塞写码(spec 本地已落地,上传是增强)
35
+
36
+ ## 下一步
37
+ - spec 已 confirmed → `/wl-code <REQ-ID>` 按 spec 严格实现(spec gate 放行)
38
+ - 实现完 → `/wl-test` 验证 → `/wl-commit` 提交回流
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wl-status
3
- description: "项目状态/路线图/健康度。Project status: current sprint / roadmap / health score. "
3
+ description: "项目状态看板。current(当前迭代进度,默认) / roadmap(路线图) / health(健康度,含工作流采纳分)。说哪个看哪个。"
4
4
  argument-hint: "[scope: current/roadmap/health]"
5
5
  auto-approve: true
6
6
  allowed-tools: [Read, Glob, Grep, Bash]
@@ -42,6 +42,8 @@ AI 据此判断"这个功能完整吗?还缺什么?"
42
42
  python -c "import json; d=json.load(open('$R/data/index/prd-features.json')); print(json.dumps(d,ensure_ascii=False,indent=2))"
43
43
  ```
44
44
 
45
+ 🎨 **富展示**(功能画像卡 HTML):`$PY "$R/.qoder/scripts/validation/metrics/present_board.py" feature --feature <功能名> --project-id <UUID>`(端点+按钮+用例+页面+PRD 卡片,QoderWork 嵌入对话 / CLI 落盘 journal)
46
+
45
47
  ## Current Status (DEFAULT)
46
48
  Show:
47
49
  1. Active developer (from .qoder/.developer)
@@ -76,3 +78,14 @@ Calculate from:
76
78
 
77
79
  Score: >=4 healthy / 3-4 at risk / <3 needs attention
78
80
  Also surface: 索引新鲜度天数、最近 3 次 EVA 分数、未同步产出数。
81
+
82
+ ### 富展示(健康看板 HTML · 复用 cap.present)
83
+
84
+ 健康分算完后,跑自包含看板 HTML(脚本内部已接 `cap.present.widget` + 落盘降级):
85
+ ```bash
86
+ $PY "$R/.qoder/scripts/validation/metrics/usability_score.py" --html
87
+ ```
88
+ - **QoderWork 桌面端**(`cap.present.available=true`,探测 `qoder_show_widget` 可达):HTML 经 widget 嵌入对话流,富展示取代纯文本表格
89
+ - **CLI/IDE**(NoOp 自动降级):落盘 `workspace/members/{dev}/journal/dashboard-{时间戳}.html`,输出路径供打开
90
+
91
+ 不用 cap.present 也能跑——上面的 Health Score 维度表本身是纯文本,富展示只是增强可视化(T244 cap.present 接入点)。