@hupan56/wlkj 2.7.12 → 3.1.2
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 +1435 -1107
- package/package.json +29 -29
- 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 +161 -161
- package/templates/qoder/commands/optional/wl-report.md +20 -39
- package/templates/qoder/commands/optional/wl-status.md +4 -4
- package/templates/qoder/commands/wl-code.md +2 -2
- package/templates/qoder/commands/wl-design.md +6 -6
- package/templates/qoder/commands/wl-init.md +3 -3
- package/templates/qoder/commands/wl-prd.md +26 -13
- package/templates/qoder/commands/wl-req.md +43 -0
- package/templates/qoder/commands/wl-search.md +78 -47
- package/templates/qoder/commands/wl-task.md +343 -40
- package/templates/qoder/commands/wl-test.md +43 -17
- package/templates/qoder/config.yaml +52 -14
- package/templates/qoder/hooks/post-tool-use.py +181 -0
- package/templates/qoder/hooks/session-start.py +94 -23
- package/templates/qoder/hooks/stop-eval.py +207 -0
- package/templates/qoder/hooks/user-prompt-submit.py +139 -0
- package/templates/qoder/rules/wl-pipeline.md +85 -49
- package/templates/qoder/scripts/README.md +102 -0
- package/templates/qoder/scripts/capability/__init__.py +26 -0
- package/templates/qoder/scripts/capability/__main__.py +72 -0
- package/templates/qoder/scripts/capability/adapters/__init__.py +29 -0
- package/templates/qoder/scripts/capability/adapters/cli.py +316 -0
- package/templates/qoder/scripts/capability/adapters/mcp.py +334 -0
- package/templates/qoder/scripts/capability/adapters/qw.py +271 -0
- package/templates/qoder/scripts/capability/caps/__init__.py +27 -0
- package/templates/qoder/scripts/capability/caps/context.py +36 -0
- package/templates/qoder/scripts/capability/caps/cron.py +50 -0
- package/templates/qoder/scripts/capability/caps/identity.py +43 -0
- package/templates/qoder/scripts/capability/caps/memory.py +71 -0
- package/templates/qoder/scripts/capability/caps/notify.py +41 -0
- package/templates/qoder/scripts/capability/caps/present.py +48 -0
- package/templates/qoder/scripts/capability/caps/repo.py +31 -0
- package/templates/qoder/scripts/capability/caps/sandbox.py +43 -0
- package/templates/qoder/scripts/capability/chain.py +92 -0
- package/templates/qoder/scripts/capability/memory_chain.py +41 -0
- package/templates/qoder/scripts/capability/registry.py +246 -0
- package/templates/qoder/scripts/capability/registry_mcp.py +250 -0
- package/templates/qoder/scripts/capability/smoke_test.py +211 -0
- package/templates/qoder/scripts/capability/smoke_test_report.json +94 -0
- package/templates/qoder/scripts/deployment/setup/__init__.py +11 -0
- package/templates/qoder/scripts/deployment/setup/carriers.py +669 -0
- package/templates/qoder/scripts/deployment/setup/carriers_verify.py +148 -0
- package/templates/qoder/scripts/{init_doctor.py → deployment/setup/init_doctor.py} +100 -39
- package/templates/qoder/scripts/{install_qoderwork.py → deployment/setup/install_qoderwork.py} +48 -30
- package/templates/qoder/scripts/{platform_doctor.py → deployment/setup/platform_doctor.py} +271 -259
- package/templates/qoder/scripts/{repo_root.py → deployment/setup/repo_root.py} +9 -2
- package/templates/qoder/scripts/{setup.py → deployment/setup/setup.py} +143 -14
- package/templates/qoder/scripts/{setup_lanhu.py → deployment/setup/setup_lanhu.py} +979 -963
- package/templates/qoder/scripts/domain/design/__init__.py +0 -0
- package/templates/qoder/scripts/{fill_prototype.py → domain/design/fill_prototype.py} +17 -5
- package/templates/qoder/scripts/{gen_design_doc.py → domain/design/gen_design_doc.py} +406 -394
- package/templates/qoder/scripts/domain/kg/__init__.py +11 -0
- package/templates/qoder/scripts/domain/kg/build/__init__.py +0 -0
- package/templates/qoder/scripts/domain/kg/build/build_entity_registry.py +201 -0
- package/templates/qoder/scripts/domain/kg/build/build_relations.py +132 -0
- package/templates/qoder/scripts/{build_style_index.py → domain/kg/build/build_style_index.py} +50 -15
- package/templates/qoder/scripts/domain/kg/build/build_workflows.py +149 -0
- package/templates/qoder/scripts/{kg_build.py → domain/kg/build/kg_build.py} +685 -612
- package/templates/qoder/scripts/{kg_build_db.py → domain/kg/build/kg_build_db.py} +338 -327
- package/templates/qoder/scripts/{kg_incremental.py → domain/kg/build/kg_incremental.py} +425 -393
- package/templates/qoder/scripts/{learn_aggregate.py → domain/kg/build/learn_aggregate.py} +212 -201
- package/templates/qoder/scripts/domain/kg/extract/__init__.py +0 -0
- package/templates/qoder/scripts/{common → domain/kg/extract}/extract.py +430 -419
- package/templates/qoder/scripts/domain/kg/extract/test_extract.py +115 -0
- package/templates/qoder/scripts/{common → domain/kg/extract}/ts_extract.py +614 -536
- package/templates/qoder/scripts/domain/kg/graph/__init__.py +0 -0
- package/templates/qoder/scripts/{kg_link_db.py → domain/kg/graph/kg_link_db.py} +235 -224
- package/templates/qoder/scripts/domain/kg/graph/kg_semantic.py +683 -0
- package/templates/qoder/scripts/{kg.py → domain/kg/kg.py} +871 -708
- package/templates/qoder/scripts/domain/kg/kg_capabilities.py +182 -0
- package/templates/qoder/scripts/domain/kg/search/__init__.py +0 -0
- package/templates/qoder/scripts/{context_pack.py → domain/kg/search/context_pack.py} +45 -17
- package/templates/qoder/scripts/{enrich_prompt.py → domain/kg/search/enrich_prompt.py} +238 -226
- package/templates/qoder/scripts/domain/kg/search/prefetch.py +384 -0
- package/templates/qoder/scripts/{common → domain/kg/search}/search_engine.py +207 -205
- package/templates/qoder/scripts/{search_index.py → domain/kg/search/search_index.py} +210 -88
- package/templates/qoder/scripts/domain/kg/server/__init__.py +0 -0
- package/templates/qoder/scripts/domain/kg/server/kgd.py +549 -0
- package/templates/qoder/scripts/domain/kg/server/perf_bench.py +197 -0
- package/templates/qoder/scripts/domain/kg/storage/__init__.py +0 -0
- package/templates/qoder/scripts/{kg_duckdb.py → domain/kg/storage/kg_duckdb.py} +70 -45
- package/templates/qoder/scripts/domain/learning/__init__.py +0 -0
- package/templates/qoder/scripts/{learn.py → domain/learning/learn.py} +157 -146
- package/templates/qoder/scripts/domain/report/__init__.py +11 -0
- package/templates/qoder/scripts/{add_session.py → domain/report/add_session.py} +256 -244
- package/templates/qoder/scripts/{export.py → domain/report/export.py} +72 -4
- package/templates/qoder/scripts/{report.py → domain/report/report.py} +292 -281
- package/templates/qoder/scripts/domain/report/report_snapshot.py +261 -0
- package/templates/qoder/scripts/domain/report/role.py +39 -0
- package/templates/qoder/scripts/{status.py → domain/report/status.py} +737 -628
- package/templates/qoder/scripts/domain/report/status_snapshot.py +191 -0
- package/templates/qoder/scripts/domain/requirement/__init__.py +0 -0
- package/templates/qoder/scripts/{archive_prd.py → domain/requirement/archive_prd.py} +389 -377
- package/templates/qoder/scripts/domain/requirement/req.py +228 -0
- package/templates/qoder/scripts/domain/task/__init__.py +11 -0
- package/templates/qoder/scripts/{git_sync.py → domain/task/git_sync.py} +90 -50
- package/templates/qoder/scripts/{syncgate.py → domain/task/syncgate.py} +18 -7
- package/templates/qoder/scripts/domain/task/task.py +229 -0
- package/templates/qoder/scripts/domain/task/task_lifecycle.py +606 -0
- package/templates/qoder/scripts/domain/task/task_query.py +162 -0
- package/templates/qoder/scripts/domain/task/task_relations.py +425 -0
- package/templates/qoder/scripts/{team_sync.py → domain/task/team_sync.py} +101 -23
- package/templates/qoder/scripts/domain/task/zentao_sync.py +370 -0
- package/templates/qoder/scripts/foundation/__init__.py +0 -0
- package/templates/qoder/scripts/foundation/bootstrap.py +145 -0
- package/templates/qoder/scripts/foundation/core/__init__.py +0 -0
- package/templates/qoder/scripts/foundation/core/cmd_registry.py +112 -0
- package/templates/qoder/scripts/foundation/core/config.py +187 -0
- package/templates/qoder/scripts/{common → foundation/core}/paths.py +706 -400
- package/templates/qoder/scripts/foundation/data/__init__.py +0 -0
- package/templates/qoder/scripts/foundation/data/contract.py +317 -0
- package/templates/qoder/scripts/{common → foundation/data}/events.py +2 -2
- package/templates/qoder/scripts/foundation/data/result.py +223 -0
- package/templates/qoder/scripts/{common → foundation/data}/task_utils.py +427 -392
- package/templates/qoder/scripts/foundation/identity/__init__.py +0 -0
- package/templates/qoder/scripts/foundation/identity/check_publish.py +103 -0
- package/templates/qoder/scripts/{common → foundation/identity}/developer.py +239 -238
- package/templates/qoder/scripts/foundation/identity/guard.py +159 -0
- package/templates/qoder/scripts/{common → foundation/identity}/identity.py +132 -9
- package/templates/qoder/scripts/foundation/identity/roles.py +60 -0
- package/templates/qoder/scripts/foundation/integrations/__init__.py +0 -0
- package/templates/qoder/scripts/{common → foundation/integrations}/active_task.py +30 -15
- package/templates/qoder/scripts/{common → foundation/integrations}/feishu.py +11 -10
- package/templates/qoder/scripts/{common → foundation/integrations}/terms.py +3 -3
- package/templates/qoder/scripts/foundation/integrations/zentao_client.py +220 -0
- package/templates/qoder/scripts/foundation/io/__init__.py +0 -0
- package/templates/qoder/scripts/{common → foundation/io}/filelock.py +1 -1
- package/templates/qoder/scripts/{common → foundation/io}/reqid.py +1 -1
- package/templates/qoder/scripts/foundation/protocol/__init__.py +0 -0
- package/templates/qoder/scripts/foundation/protocol/duckdb_conn.py +39 -0
- package/templates/qoder/scripts/foundation/protocol/mcp_base.py +268 -0
- package/templates/qoder/scripts/foundation/utils/__init__.py +0 -0
- package/templates/qoder/scripts/{common → foundation/utils}/eval_api.py +12 -1
- package/templates/qoder/scripts/{common → foundation/utils}/pip_install.py +23 -6
- package/templates/qoder/scripts/{common → foundation/utils}/platform_guard.py +1 -1
- package/templates/qoder/scripts/orchestration/__init__.py +0 -0
- package/templates/qoder/scripts/orchestration/wlkj.py +185 -0
- package/templates/qoder/scripts/protocol/__init__.py +0 -0
- package/templates/qoder/scripts/protocol/browser/README.md +207 -0
- package/templates/qoder/scripts/protocol/browser/SKILL.md +265 -0
- package/templates/qoder/scripts/protocol/browser/config.env +9 -0
- package/templates/qoder/scripts/protocol/browser/references/cdp-api.md +110 -0
- package/templates/qoder/scripts/protocol/browser/references/migration-2.5.3.md +72 -0
- package/templates/qoder/scripts/protocol/browser/references/site-patterns/.gitkeep +0 -0
- package/templates/qoder/scripts/protocol/browser/scripts/browser-discovery.mjs +138 -0
- package/templates/qoder/scripts/protocol/browser/scripts/cdp-proxy.mjs +672 -0
- package/templates/qoder/scripts/protocol/browser/scripts/check-deps.mjs +206 -0
- package/templates/qoder/scripts/protocol/browser/scripts/find-url.mjs +253 -0
- package/templates/qoder/scripts/protocol/browser/scripts/match-site.mjs +46 -0
- package/templates/qoder/scripts/protocol/browser/templates/config.env.template +9 -0
- package/templates/qoder/scripts/protocol/mcp/__init__.py +11 -0
- package/templates/qoder/scripts/protocol/mcp/kg_mcp_server.py +478 -0
- package/templates/qoder/scripts/{lanhu_stdio_wrapper.py → protocol/mcp/lanhu_stdio_wrapper.py} +131 -119
- package/templates/qoder/scripts/protocol/mcp/mcp_doctor.py +548 -0
- package/templates/qoder/scripts/protocol/mcp/mcp_launcher.py +600 -0
- package/templates/qoder/scripts/protocol/mcp/mysql_mcp_server.py +461 -0
- package/templates/qoder/scripts/protocol/mcp/zentao_mcp_server.py +1920 -0
- package/templates/qoder/scripts/protocol/transports/__init__.py +56 -0
- package/templates/qoder/scripts/protocol/transports/base.py +87 -0
- package/templates/qoder/scripts/protocol/transports/cli.py +132 -0
- package/templates/qoder/scripts/protocol/transports/http.py +141 -0
- package/templates/qoder/scripts/protocol/transports/stdio.py +293 -0
- package/templates/qoder/scripts/run_weekly_update.bat +27 -18
- package/templates/qoder/scripts/run_weekly_update.sh +22 -13
- package/templates/qoder/scripts/validation/__init__.py +0 -0
- package/templates/qoder/scripts/validation/eval/__init__.py +0 -0
- package/templates/qoder/scripts/validation/eval/perf-report-2026-06-24.md +139 -0
- package/templates/qoder/scripts/validation/eval/qwork_harness.py +617 -0
- package/templates/qoder/scripts/validation/eval/report-commands.md +220 -0
- package/templates/qoder/scripts/validation/eval/transcript_timing.py +386 -0
- package/templates/qoder/scripts/validation/metrics/__init__.py +0 -0
- package/templates/qoder/scripts/{eval_prd.py → validation/metrics/eval_prd.py} +84 -15
- package/templates/qoder/scripts/validation/metrics/usability_score.py +750 -0
- package/templates/qoder/scripts/validation/test/__init__.py +11 -0
- package/templates/qoder/scripts/validation/test/assertion_gen.py +551 -0
- package/templates/qoder/scripts/{autotest.py → validation/test/autotest.py} +1234 -1751
- package/templates/qoder/scripts/validation/test/autotest_auth.py +109 -0
- package/templates/qoder/scripts/{autotest_batch.py → validation/test/autotest_batch.py} +255 -224
- package/templates/qoder/scripts/validation/test/autotest_data.py +680 -0
- package/templates/qoder/scripts/validation/test/autotest_opencli.py +646 -0
- package/templates/qoder/scripts/{autotest_run.py → validation/test/autotest_run.py} +323 -297
- package/templates/qoder/scripts/validation/test/autotest_webaccess.py +571 -0
- package/templates/qoder/scripts/{benchmark.py → validation/test/benchmark.py} +17 -5
- package/templates/qoder/scripts/{kg_auto_login.py → validation/test/kg_auto_login.py} +208 -196
- package/templates/qoder/scripts/{kg_test_runner.py → validation/test/kg_test_runner.py} +13 -2
- package/templates/qoder/scripts/{page_probe.py → validation/test/page_probe.py} +470 -459
- package/templates/qoder/scripts/validation/test/smoke_all_commands.py +170 -0
- package/templates/qoder/settings.json +23 -2
- package/templates/qoder/skills/design-import/SKILL.md +235 -226
- package/templates/qoder/skills/design-review/SKILL.md +91 -82
- package/templates/qoder/skills/prd-generator/SKILL.md +38 -24
- package/templates/qoder/skills/prd-review/SKILL.md +8 -6
- package/templates/qoder/skills/prototype-generator/SKILL.md +296 -247
- package/templates/qoder/skills/spec-coder/SKILL.md +24 -15
- package/templates/qoder/skills/spec-generator/SKILL.md +24 -12
- package/templates/qoder/skills/test-generator/SKILL.md +9 -7
- package/templates/qoder/skills/wl-code/SKILL.md +25 -13
- package/templates/qoder/skills/wl-commit/SKILL.md +10 -9
- package/templates/qoder/skills/wl-design/SKILL.md +7 -5
- package/templates/qoder/skills/wl-init/SKILL.md +8 -8
- package/templates/qoder/skills/wl-insight/SKILL.md +25 -12
- package/templates/qoder/skills/wl-prd-full/SKILL.md +59 -8
- package/templates/qoder/skills/wl-prd-quick/SKILL.md +7 -7
- package/templates/qoder/skills/wl-prd-review/SKILL.md +18 -6
- package/templates/qoder/skills/wl-report/SKILL.md +27 -25
- package/templates/qoder/skills/wl-search/SKILL.md +151 -80
- package/templates/qoder/skills/wl-spec/SKILL.md +9 -7
- package/templates/qoder/skills/wl-status/SKILL.md +50 -18
- package/templates/qoder/skills/wl-task/SKILL.md +94 -12
- package/templates/qoder/skills/wl-test/SKILL.md +154 -45
- package/templates/qoder/templates/prd-full-template.md +7 -0
- package/templates/root/AGENTS.md +275 -237
- package/templates/root/requirements.txt +3 -0
- package/templates/root//344/275/277/347/224/250/350/257/264/346/230/216.md +3 -3
- package/templates/root//346/226/260/346/211/213/346/214/207/345/215/227.md +2 -2
- 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.py +0 -298
- 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_api_params.py +0 -246
- 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/kg_mcp_server.py +0 -801
- package/templates/qoder/scripts/kg_semantic.py +0 -150
- package/templates/qoder/scripts/mcp_launcher.py +0 -414
- package/templates/qoder/scripts/mysql_mcp_server.py +0 -396
- 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/scripts/zentao_mcp_server.py +0 -424
- package/templates/qoder/skills/prompt-enrich/SKILL.md +0 -90
- /package/templates/qoder/scripts/{common → deployment}/__init__.py +0 -0
- /package/templates/qoder/{skills/prototype-generator/SKILL.md.zcode-79180-2af4721f-f9a6-412c-88db-c0af680d211b.tmp → scripts/domain/__init__.py} +0 -0
- /package/templates/qoder/scripts/{common → domain/kg/graph}/graph_traverse.py +0 -0
- /package/templates/qoder/scripts/{common → domain/kg/server}/repowiki.py +0 -0
- /package/templates/qoder/scripts/{common → foundation/io}/atomicio.py +0 -0
- /package/templates/qoder/scripts/{secure-ls.js → validation/test/secure-ls.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: spec-generator
|
|
3
|
-
description: "从已确认的 PRD 自动生成开发 Spec 文档(技术规格说明)。Auto-generate development Spec documents from confirmed PRDs.
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "从已确认的 PRD 自动生成开发 Spec 文档(技术规格说明)。Auto-generate development Spec documents from confirmed PRDs. "
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "PRD 被确认/发布后自动触发;或用户说'生成Spec''写技
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# Spec Generator
|
|
17
17
|
|
|
@@ -23,11 +23,13 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
23
23
|
|
|
24
24
|
## ⚙️ 自取上下文(Quest / QoderWork 无 hook 注入,必须自读)
|
|
25
25
|
|
|
26
|
-
-
|
|
27
|
-
|
|
26
|
+
- **当前身份**:当前开发者。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
|
|
27
|
+
再 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
|
|
28
|
+
⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
|
|
29
|
+
- **活动任务**:当前任务(决定 spec 存到哪个 task 目录)。读法 `python "$R/.qoder/scripts/foundation/core/paths.py" current-task`(输出任务路径;空=无活动任务)。
|
|
28
30
|
- 扫描 PRD 来源目录:`data/docs/prd/`(已发布)+ `workspace/members/{dev}/drafts/REQ-*.md`(草稿)
|
|
29
31
|
找出还没有对应 Spec 的 PRD
|
|
30
|
-
- 风格/字段参考:`python "$R/.qoder/scripts/
|
|
32
|
+
- 风格/字段参考:`python "$R/.qoder/scripts/orchestration/wlkj.py" search --field <字段名>` 查现有字段命名约定
|
|
31
33
|
- 团队 Java 约定(MyBatis Plus + RESTful + BigDecimal 金额)写在本 skill 的 Step 3
|
|
32
34
|
|
|
33
35
|
## Step 1: 定位 PRD
|
|
@@ -43,15 +45,25 @@ ls workspace/members/{developer}/drafts/REQ-*.md
|
|
|
43
45
|
|
|
44
46
|
## Step 2: 读取上下文
|
|
45
47
|
|
|
46
|
-
|
|
48
|
+
### ⚡ 取全一次到位(先跑,省掉后续多次 search/Read)
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
cap.mcp.call("context_pack", {"keyword": "..."}) <PRD里的模块关键词> --platform <web|app> --role dev
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**一次拿到**:相关代码文件(第1段) + 真实字段名(第3段) + 相关 API(第5段) + Repo Wiki(第7段)。
|
|
55
|
+
照着第1段命中的相似文件学写法,**不要再 search_index 单词搜**。
|
|
56
|
+
|
|
57
|
+
### 同时并发补这几项(与 context_pack 无依赖,同回合并发)
|
|
58
|
+
|
|
47
59
|
1. **PRD 文件**(必需):需求源
|
|
48
60
|
2. **历史 Spec**(推荐):扫 `workspace/specs/` 看同类需求的写法,照着写
|
|
49
|
-
3.
|
|
50
|
-
|
|
51
|
-
5. **真实表结构(强烈推荐)**:调 MySQL MCP 查数据库真实字段,别靠猜。
|
|
52
|
-
- `mcp__qoder-mysql__query_schema(table='quality_case', db='fywl_ics_quality')`
|
|
61
|
+
3. **真实表结构**(强烈推荐):context_pack 不含 DB schema,写 API 字段前单独查
|
|
62
|
+
- 先 `cap.mcp.call("list_envs", {})` 问环境,再 `query_schema(table='quality_case', db='fywl_ics_quality')`
|
|
53
63
|
- 拿到真实列名/类型/注释(注释里常含枚举定义,如"0=小时,1=工作日")
|
|
54
|
-
|
|
64
|
+
|
|
65
|
+
> 数据字典 `.qoder/context/data-dictionary.md` 如存在顺手读,不存在跳过。
|
|
66
|
+
> 以上 PRD/历史Spec/query_schema 三项相互独立 → **同一条消息并发发**,不要逐个等。
|
|
55
67
|
|
|
56
68
|
## Step 3: 分析并生成
|
|
57
69
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: test-generator
|
|
3
|
-
description: "从已实现代码和 Spec 自动生成单元测试。Auto-generate unit tests from implemented code and Spec.
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "从已实现代码和 Spec 自动生成单元测试。Auto-generate unit tests from implemented code and Spec. 需用户确认(DANGEROUS)。"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "代码实现完成后;用户说'写测试''补单测''生成test''/w
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# Test Generator
|
|
17
17
|
|
|
@@ -25,12 +25,14 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
25
25
|
|
|
26
26
|
## ⚙️ 自取上下文(Quest / QoderWork 无 hook 注入,必须自读)
|
|
27
27
|
|
|
28
|
-
-
|
|
29
|
-
|
|
28
|
+
- **当前身份**:当前开发者。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
|
|
29
|
+
再 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
|
|
30
|
+
⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
|
|
31
|
+
- **活动任务**:当前任务。读法 `python "$R/.qoder/scripts/foundation/core/paths.py" current-task`(输出任务路径;空=无活动任务)。
|
|
30
32
|
- Spec 文件:`workspace/specs/REQ-{ID}-*.spec.md` 或 `workspace/tasks/{task-id}/spec.md`
|
|
31
33
|
- 已实现代码:用 search_index.py 定位
|
|
32
34
|
```bash
|
|
33
|
-
python "$R/.qoder/scripts/
|
|
35
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" search <类名或模块关键词>
|
|
34
36
|
```
|
|
35
37
|
|
|
36
38
|
## Step 1: 定位待测代码
|
|
@@ -48,7 +50,7 @@ ls data/code/ # 已实现代码库
|
|
|
48
50
|
2. **Spec 文件**(推荐):测试用例映射来源
|
|
49
51
|
3. **现有测试代码**(推荐):用 search_index.py 找同类 Test 类,照着写
|
|
50
52
|
```bash
|
|
51
|
-
python "$R/.qoder/scripts/
|
|
53
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" search Test
|
|
52
54
|
```
|
|
53
55
|
|
|
54
56
|
## Step 3: 生成测试
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-code
|
|
3
|
-
description: "按开发 Spec 严格实现代码(/wl-code 命令入口)。Implement code following a Spec strictly.
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "按开发 Spec 严格实现代码(/wl-code 命令入口)。Implement code following a Spec strictly. 需用户确认(DANGEROUS)。"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "Spec 已确认待实现;用户说'开始写代码''按spec实现''/w
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-code — 按 Spec 实现代码(/wl-code 命令入口)
|
|
17
17
|
|
|
@@ -22,28 +22,40 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
22
22
|
|
|
23
23
|
## ⚙️ 自取上下文(Quest / QoderWork 无 hook 注入,必须自读)
|
|
24
24
|
|
|
25
|
-
-
|
|
26
|
-
|
|
25
|
+
- **当前身份**:当前开发者。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
|
|
26
|
+
再 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
|
|
27
|
+
⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
|
|
28
|
+
- **活动任务**:当前活动任务(找对应的 spec)。读法 `python "$R/.qoder/scripts/foundation/core/paths.py" current-task`(输出任务路径;空=无活动任务)。
|
|
27
29
|
- 活动任务的 spec:`workspace/specs/` 或 `workspace/tasks/{id}/spec.md`
|
|
28
30
|
|
|
29
|
-
###
|
|
31
|
+
### ⚡ 取全一次到位(spec 里的模块名 → 1 次 context_pack 拿全)
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
```bash
|
|
34
|
+
cap.mcp.call("context_pack", {"keyword": "..."}) <模块关键词> --platform <web|app> --role dev
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**一次返回**:相关代码文件(第1段) + 字段真名(第3段) + 相关 API(第5段) + Repo Wiki(第7段)。
|
|
38
|
+
拿到后直接 Read 2-3 个命中的代码文件照着写,**不要再 search_index 单词搜**(context 第1段已给全代码路径)。
|
|
39
|
+
> 只有关键词命中太少时,才回退 `search_index.py <词>` 补搜。
|
|
40
|
+
|
|
41
|
+
### 改表/改 Entity 前必查(用知识图谱 MCP,防改崩)
|
|
42
|
+
|
|
43
|
+
> ⚠️ 本段依赖知识图谱 MCP(`cap.mcp.call("search_code", ...)` / `cap.mcp.call("query_schema", ...)`),自动路由。
|
|
44
|
+
> Qoder IDE/Quest/CLI 无 MCP 时:table_impact 无脚本等价,需人工评估改动波及面;真实字段可用 `python "$R/.qoder/scripts/orchestration/wlkj.py" search --field <表名>` 查代码侧字段(不含 DB 真实列类型)。
|
|
45
|
+
|
|
46
|
+
1. **改表影响分析**:涉及改数据库表/Entity 时,先 `cap.mcp.call("table_impact", {"table": "表名"})`
|
|
32
47
|
- 查这张表关联哪些 Entity + 影响哪些 Controller/接口。
|
|
33
48
|
- 例:`table_impact(table='quality_case')` → 发现影响 QualityCaseController + 5 个接口。
|
|
34
49
|
- 看完才知道改动波及面,避免改一处崩多处。
|
|
35
|
-
2. **真实字段核对**:写 Entity/SQL 前 `
|
|
50
|
+
2. **真实字段核对**:写 Entity/SQL 前 `cap.mcp.call("query_schema", {"table": "表名"})`
|
|
51
|
+
- context_pack 不含 DB 表结构(只有代码字段名),写 Entity/DDL 必须单独查真实列。
|
|
36
52
|
- 拿真实列名/类型/注释(含枚举定义),别靠推断。
|
|
37
53
|
- [QAS环境] 表结构与生产一致可放心用。
|
|
38
54
|
|
|
39
55
|
## 执行
|
|
40
56
|
|
|
41
57
|
1. **加载 Spec**:按 REQ-ID 找 spec;没参数就读 `.qoder/.current-task`
|
|
42
|
-
2.
|
|
43
|
-
```bash
|
|
44
|
-
python "$R/.qoder/scripts/search_index.py" <关键词>
|
|
45
|
-
```
|
|
46
|
-
读相关文件了解现有模式。
|
|
58
|
+
2. **一次取全上下文**:用上面 context_pack(spec 里的模块名)拿代码+字段+API,再 Read 命中的 2-3 个文件
|
|
47
59
|
3. **按 spec-coder skill 实现**:严格按 spec,遵循 data/code/ 的团队约定
|
|
48
60
|
4. **自检**:
|
|
49
61
|
- [ ] Spec 所有需求都覆盖
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-commit
|
|
3
|
-
description: "代码提交 + push + 同步,带质量门禁。Git commit + push + sync with pre-commit quality gate.
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "代码提交 + push + 同步,带质量门禁。Git commit + push + sync with pre-commit quality gate. 需用户确认(DANGEROUS)。"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "用户说'提交''commit''推上去''保存代码''提交一下''/wl-c
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-commit — 代码提交 + 质量门禁 + 同步
|
|
17
17
|
|
|
@@ -21,18 +21,19 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
21
21
|
|
|
22
22
|
## ⚙️ 自取上下文(Quest / QoderWork 无 hook 注入,必须自读)
|
|
23
23
|
|
|
24
|
-
-
|
|
24
|
+
- **当前身份**:当前开发者(提交作者)。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
|
|
25
|
+
再 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
|
|
26
|
+
⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
|
|
25
27
|
- 当前工作目录的 `git status` 和 `git diff --stat` 看改了什么
|
|
26
|
-
-
|
|
28
|
+
- **活动任务**:若有活动任务,提交信息关联任务 ID。读法 `python "$R/.qoder/scripts/foundation/core/paths.py" current-task`(输出任务路径;空=无活动任务)。
|
|
27
29
|
|
|
28
30
|
## 执行流程
|
|
29
31
|
|
|
30
32
|
### Step 1: 看改动
|
|
31
33
|
```bash
|
|
32
|
-
git status
|
|
33
|
-
git diff --stat
|
|
34
|
-
git diff --cached --stat
|
|
34
|
+
git status && git diff HEAD --stat
|
|
35
35
|
```
|
|
36
|
+
> 三个只读查询合并成一条命令一次拿全(status + 工作区/暂存区改动清单),别分三次发。
|
|
36
37
|
|
|
37
38
|
### Step 2: 质量门禁(提交前自检)
|
|
38
39
|
|
|
@@ -70,7 +71,7 @@ git push
|
|
|
70
71
|
|
|
71
72
|
提交成功后埋点(写当前开发者的 journal,供 /wl-status 健康度统计):
|
|
72
73
|
```bash
|
|
73
|
-
python "$R/.qoder/scripts/
|
|
74
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" learn record commit_done "{\"files\": <改动文件数>, \"task\": \"<关联任务ID或空>\"}"
|
|
74
75
|
```
|
|
75
76
|
> 失败静默忽略,绝不阻塞提交流程。
|
|
76
77
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-design
|
|
3
|
-
description: "设计工序入口: import 录入设计稿→spec.json(默认) / generate 按设计spec出原型 / review
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "设计工序入口: import 录入设计稿→spec.json(默认) / generate 按设计spec出原型 / review 评审原型。"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "用户说'录入设计稿''Figma稿录入''按设计出原型''评审
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-design — 设计工序入口(/wl-design 命令入口)
|
|
17
17
|
|
|
@@ -36,8 +36,10 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
36
36
|
|
|
37
37
|
## ⚙️ 自取上下文(Quest / QoderWork 无 hook 注入,必须自读)
|
|
38
38
|
|
|
39
|
-
-
|
|
40
|
-
|
|
39
|
+
- **当前身份**:当前设计师名(产出归属)。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
|
|
40
|
+
再 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
|
|
41
|
+
⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
|
|
42
|
+
- **活动任务**:若存在,spec/原型命名带上任务关键词。读法 `python "$R/.qoder/scripts/foundation/core/paths.py" current-task`(输出任务路径;空=无活动任务)。
|
|
41
43
|
- 平台必须明确(Web/APP/Both);如未指定,先问
|
|
42
44
|
- 风格真源:`data/style/*-design-spec.json`(优先)→ `data/code/` 源码 → `data/index/vben-style-reference.json`(Web)/ Vant(APP)
|
|
43
45
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-init
|
|
3
|
-
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check.
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "初始化/切换开发者身份 + 环境体检。Initialize/switch developer identity + environment health check. "
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "首次使用、换人、或遇到环境问题时;用户说'初始化
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-init — 开发者身份 + 环境体检
|
|
17
17
|
|
|
@@ -28,14 +28,14 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
28
28
|
|
|
29
29
|
### 无参数(仅体检)
|
|
30
30
|
```bash
|
|
31
|
-
python "$R/.qoder/scripts/
|
|
31
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" doctor
|
|
32
32
|
```
|
|
33
33
|
输出 8 段体检报告,每行 `[OK]/[WARN]/[FIX]/[MISS]` 标注。
|
|
34
34
|
|
|
35
35
|
### 带名字(注册 + 自愈)
|
|
36
36
|
```bash
|
|
37
|
-
python "$R/.qoder/scripts/
|
|
38
|
-
# 例:python "$R/.qoder/scripts/
|
|
37
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix <名字> [角色]
|
|
38
|
+
# 例:python "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix 小王 pm
|
|
39
39
|
```
|
|
40
40
|
做 3 件事:
|
|
41
41
|
1. 写 `.qoder/.developer`(key=value 格式)
|
|
@@ -44,7 +44,7 @@ python "$R/.qoder/scripts/init_doctor.py" --fix <名字> [角色]
|
|
|
44
44
|
|
|
45
45
|
### 仅自愈(不换人)
|
|
46
46
|
```bash
|
|
47
|
-
python "$R/.qoder/scripts/
|
|
47
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" doctor --fix
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
## 体检覆盖的 8 段
|
|
@@ -71,6 +71,6 @@ python "$R/.qoder/scripts/init_doctor.py" --fix
|
|
|
71
71
|
体检/注册本身不需要 push(只改本地 `.developer`)。但若 `--fix` 触发了图谱重建,
|
|
72
72
|
完成后建议跑一次:
|
|
73
73
|
```bash
|
|
74
|
-
|
|
74
|
+
cap.mcp.call("sync", {"direction": "push"})
|
|
75
75
|
```
|
|
76
76
|
让队友拿到刷新后的索引。
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-insight
|
|
3
|
-
description: "需求探索 + 外部调研 + 未来规划。流水线的'上游探索站',负责发现需求、对标竞品、做 Gap 分析和 roadmap。把'该做什么、为什么做'想清楚,结论交给 /wl-prd-full
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "需求探索 + 外部调研 + 未来规划。流水线的'上游探索站',负责发现需求、对标竞品、做 Gap 分析和 roadmap。把'该做什么、为什么做'想清楚,结论交给 /wl-prd-full 落地。"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,7 +11,7 @@ trigger: "用户说'调研''竞品''对标''规划''路线图''roadmap''探讨
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-insight — 需求探索(7 站之前的「探索站」· 产品工位)
|
|
17
17
|
|
|
@@ -54,17 +54,30 @@ insight(探索/调研/规划)→ [用户确认转PRD] → prd(落地)→
|
|
|
54
54
|
|
|
55
55
|
## ⚙️ 自取上下文(Quest / QoderWork 无 hook 注入,必须自读)
|
|
56
56
|
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
-
|
|
57
|
+
- **当前身份**:当前探索者(报告归属)。读法:先 `R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.` 定位仓库根,
|
|
58
|
+
再 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`(输出开发者名;空=未初始化)。
|
|
59
|
+
⚠️ 勿用裸相对路径 `.qoder/.developer`(QoderWork 桌面端 cwd 不在仓库根,会读不到而误报未初始化)。
|
|
60
|
+
- **现状锚点(必跑,只跑这一次)**:用 prefetch 一次取全,不要串行换词搜:
|
|
61
|
+
```bash
|
|
62
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" kg prefetch "<需求描述原句>"
|
|
63
|
+
```
|
|
64
|
+
> **不传 `--platform` = 默认双平台一次返回**(platform: all)。探索阶段需求常未定平台,
|
|
65
|
+
> 直接默认双平台拿全,**绝不 web 跑一次、app 再跑一次**(这是 insight 慢的 #2 元凶)。
|
|
66
|
+
> 用户明确说"只要 web/只要 app"时,才加 `--platform web` 或 `app`。
|
|
67
|
+
> 探索需求常含多业务实体(如"3D地图实时车辆调度"),prefetch 自动拆多词批量搜、
|
|
68
|
+
> 一次合并代码+页面+字段+历史PRD标题+API+RepoWiki。**拿到后不要再串行 search/find/grep**,
|
|
69
|
+
> 也不要再单独扫 `data/docs/prd/`(prefetch 第4段已返回相关历史 PRD 标题,要参考某篇再单独读那篇)。
|
|
70
|
+
- `workspace/members/{dev}/journal/feedback.jsonl` — 历史 insight 报告索引(可能为空;按人分文件,团队 git 共享)
|
|
71
|
+
|
|
72
|
+
> 🚫 禁止串行换词搜:第一次 prefetch 没命中或命中少,先反思是不是需求描述太泛,
|
|
73
|
+
> 不要本能地 context_pack 换第2个、第3个词再搜(这是 insight 慢的 #1 元凶)。
|
|
61
74
|
|
|
62
75
|
---
|
|
63
76
|
|
|
64
77
|
## 🔒 三道前置检查(任何动作前先做)
|
|
65
78
|
|
|
66
|
-
1.
|
|
67
|
-
2. **现状锚点**:任何探索前先跑 `
|
|
79
|
+
1. **身份检查**:跑 `python "$R/.qoder/scripts/foundation/core/paths.py" whoami`,无输出/退出码1 = 未初始化 → 停下,提示先 `/wl-init`
|
|
80
|
+
2. **现状锚点**:任何探索前先跑 **1 次** `kg.py prefetch "<需求句>"`(见上方自取上下文段)。**不锚定现状的探索 = 凭空臆想,禁止。禁止串行换词搜。**
|
|
68
81
|
3. **报告归属**:报告必须写到 `workspace/members/{dev}/drafts/`,用 `.developer` 归属。
|
|
69
82
|
|
|
70
83
|
---
|
|
@@ -106,7 +119,7 @@ OST ├─ Opportunity(用户机会/痛点)─ discover ──┤ → i
|
|
|
106
119
|
## 三类型怎么做(概要,详见命令定义)
|
|
107
120
|
|
|
108
121
|
**discover(需求发现)—— 用 JTBD + OST 前两层:**
|
|
109
|
-
1. 跑
|
|
122
|
+
1. 跑 **1 次** prefetch 锚定现状(多业务实体一次取全,不要串行换词搜)
|
|
110
123
|
2. 用 JTBD 还原"用户要完成什么 job",列出痛点/机会
|
|
111
124
|
3. 每个机会对应一个业务 outcome(OST 第 1-2 层)
|
|
112
125
|
4. 输出机会清单,问用户"哪个值得深入?"
|
|
@@ -155,7 +168,7 @@ prd 以 reference 模式(mode: reference)承接,读取 insight 报告作
|
|
|
155
168
|
|
|
156
169
|
## 🧩 QoderWork 增强:外部数据源(可选 · 无连接器则自动回退)
|
|
157
170
|
|
|
158
|
-
>
|
|
171
|
+
> 通过 capability 层自动路由(Settings → Connectors & MCP)。
|
|
159
172
|
> **纯 Qoder IDE / CLI 没有连接器 → 本段不生效,insight 用 context_pack + web 搜索足够。**
|
|
160
173
|
> 探测方式:仅当运行环境提供了「Browser / MCP 工具」可调用时才用。
|
|
161
174
|
|
|
@@ -186,7 +199,7 @@ prd 以 reference 模式(mode: reference)承接,读取 insight 报告作
|
|
|
186
199
|
|
|
187
200
|
insight 报告**默认不 push**(个人探索草稿)。用户说"发出去/同步/分享给团队"才:
|
|
188
201
|
```bash
|
|
189
|
-
|
|
202
|
+
cap.mcp.call("sync", {"direction": "push"})
|
|
190
203
|
```
|
|
191
204
|
|
|
192
205
|
---
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-prd-full
|
|
3
|
-
description: "完整档 PRD + 原型(13 章,正经需求)。新模块/新业务/新流程用这个。支持 参考:<insight报告>
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "完整档 PRD + 原型(13 章,正经需求)。新模块/新业务/新流程用这个。支持 参考:<insight报告> 衔接探索站。先问平台!"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,13 +11,13 @@ trigger: "用户描述正经需求、要 PRD、要原型、要 mockup,或直
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-prd-full — 完整档 PRD + 原型(/wl-prd-full 命令入口)
|
|
17
17
|
|
|
18
18
|
> 这是 `/wl-prd-full` 命令的 skill 入口。QoderWork 的 `/` 列表读 skills,
|
|
19
19
|
> 所以本 skill 让 QoderWork 也能用 `/wl-prd-full`,与 Qoder IDE 保持一致。
|
|
20
|
-
> 完整工作流见同名 command 文件 `.qoder/commands/wl-prd
|
|
20
|
+
> 完整工作流见同名 command 文件 `.qoder/commands/wl-prd.md`,
|
|
21
21
|
> 功能实现层见 `.qoder/skills/prd-generator/SKILL.md`。
|
|
22
22
|
> **第一性原理:又快又准。**
|
|
23
23
|
|
|
@@ -38,6 +38,49 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
38
38
|
| 2 / APP / H5 / 移动端 | APP | `--platform app` | prototype-app.html |
|
|
39
39
|
| 3 / 都要 / 两端 | Both | 都跑 | 两个模板,两份原型 |
|
|
40
40
|
|
|
41
|
+
## ⚠️ STEP 0.5: 原型要不要画?(融入 Step 2 批量确认,不另开轮次)
|
|
42
|
+
|
|
43
|
+
**不交给 AI 默默判断**(避免"AI 觉得不需要、用户其实想要"的扯皮),但也**不额外开一轮问答**——
|
|
44
|
+
合并进 Step 2「轻反思 + 批量确认」那一步,跟背景/目标/指标一起一次性问完。
|
|
45
|
+
|
|
46
|
+
### 关键词触发矩阵(给默认建议,用户可一键改)
|
|
47
|
+
|
|
48
|
+
| 模式 | 关键词信号 | 默认建议 | 例子 |
|
|
49
|
+
|------|-----------|---------|------|
|
|
50
|
+
| 评审 | (任何) | ❌ 不画 | 评审别人的 PRD,本就不画 |
|
|
51
|
+
| 快速 | 加字段/按钮/文案/导出/接口 | ❌ 不画 | "列表加个导出按钮" |
|
|
52
|
+
| 快速 | 含"页面/弹窗/表单/交互" | ✅ 画 | "弹窗里加 3 个字段" |
|
|
53
|
+
| 完整 | 含"页面/菜单/详情/列表/向导/看板/大屏" | ✅ 画 | "新出库单页面" |
|
|
54
|
+
| 完整 | 纯"规则/接口/定时/对账/计算/开关/参数/性能" | ❌ 不画 | "出交车点检固定为总部全局规则" |
|
|
55
|
+
| 完整 | 混合(既有页面又有规则) | ✅ 画(只画页面那部分) | "新增审批流 + 审批页" |
|
|
56
|
+
|
|
57
|
+
### Step 2 问法(合并到批量确认)
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
确认 3 件事就开工:
|
|
61
|
+
1. 背景/目标:……(AI 已补,要改吗?)
|
|
62
|
+
2. 关键指标:……(AI 已补,要改吗?)
|
|
63
|
+
3. 原型图:我建议【画/不画】,因为……(理由)。
|
|
64
|
+
要改吗?(画 / 不画 / 两端各画一份)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### 两端都画时的边界(v3.1)
|
|
68
|
+
|
|
69
|
+
「完整模式 + 两端都要」如果用户选了"画",**默认只画主端一份**(用户在 PRD 里标的主端),
|
|
70
|
+
另一端在 PRD 第 11 章写"复用主端规则,UI 适配另出"。用户明确说"两端各画一份"才画 2 份。
|
|
71
|
+
|
|
72
|
+
### 不画原型时的下游连锁(必须对齐)
|
|
73
|
+
|
|
74
|
+
| 产物 | 处理 |
|
|
75
|
+
|------|------|
|
|
76
|
+
| PRD 第 11 章「原型地址」 | 写 `无({原因},经用户确认豁免)`,**保留章节标题**不省略 |
|
|
77
|
+
| PRD 第 1 行 `@contract` 头 | 标记 `prototype: none` |
|
|
78
|
+
| eval_prd | 检测到 `prototype: none` → A2 自动跳过,满分从 100 降到 70,照样能 PASS |
|
|
79
|
+
| /wl-design | 读到 `prototype: none` 跳过原型环节 |
|
|
80
|
+
| /wl-code | 直接以 PRD 字段表为准 |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
41
84
|
## 衔接 insight(参考模式)
|
|
42
85
|
|
|
43
86
|
**若用户说"按 insight 报告做 PRD""转 PRD"或带 `参考:<报告路径>`:**
|
|
@@ -46,14 +89,22 @@ Read 指定 insight 报告 → 把现状锚定 + 选中的机会/Gap 作为 PRD
|
|
|
46
89
|
|
|
47
90
|
## 完整流程(详细见 command 文件)
|
|
48
91
|
|
|
49
|
-
1. **并行取全上下文**:先读当前角色(`python "$R/.qoder/scripts/
|
|
92
|
+
1. **并行取全上下文**:先读当前角色(`python "$R/.qoder/scripts/orchestration/wlkj.py" role` 输出 pm/design/dev/test/admin 之一),用 prefetch 一次取全(完整档需求含多业务实体,prefetch 多词预测比单词 context 更准):
|
|
50
93
|
```bash
|
|
51
|
-
ROLE=$(python "$R/.qoder/scripts/
|
|
52
|
-
python "$R/.qoder/scripts/
|
|
94
|
+
ROLE=$(python "$R/.qoder/scripts/orchestration/wlkj.py" role 2>/dev/null || echo pm)
|
|
95
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" kg prefetch "<需求描述原句>" --platform <p>
|
|
53
96
|
```
|
|
97
|
+
> prefetch 把需求句拆成多个业务词批量搜、一次合并(例"考勤导入校验"→考勤/导入两词全搜)。
|
|
98
|
+
> 拿到后**按 $ROLE 视角看重点**:dev 看代码段、design 看页面+风格段、pm 看字段+历史PRD段。prefetch 之后不要再串行 search。
|
|
54
99
|
> 不硬编码 pm:dev 写 PRD 能拿到代码视角、设计师拿到页面+风格视角,比统一 PM 视角更"准"。
|
|
55
100
|
2. **轻反思 + 批量确认**:AI 自动补全背景/目标/指标,只把真缺失的 1-2 点一次性问完
|
|
56
|
-
3. **一次生成 + 3 道质量锁**:
|
|
101
|
+
3. **一次生成 + 3 道质量锁**:
|
|
102
|
+
- PRD(prd-full-template.md,13 章)一次 Write
|
|
103
|
+
- **原型按 Step 0.5 决策**:用户选"画"→ 走 prototype-generator(必须先 fill_prototype);
|
|
104
|
+
用户选"不画"→ 跳过,PRD 第 11 章写 `无` + contract 头标 `prototype: none`
|
|
105
|
+
- 3 道质量锁:背景锁/字段锁/闭环锁 → eval_prd(**不要加 `2>/dev/null`,stderr 阻断原因要看**)→ 不过自动修
|
|
106
|
+
- eval 命令:`python "$R/.qoder/scripts/orchestration/wlkj.py" eval <prd.md> [原型.html]`
|
|
107
|
+
(wlkj.py eval 内部映射 validation/metrics/eval_prd.py,路径不会漂移)
|
|
57
108
|
4. **发布 + 归档 + 同步**(3 合 1):collect_prds → team_sync push → archive_prd
|
|
58
109
|
|
|
59
110
|
## 🔒 3 道质量锁
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-prd-quick
|
|
3
|
-
description: "小改动极速出 Mini-PRD(6
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "小改动极速出 Mini-PRD(6 章)。加字段/加按钮/改文案/加导出等零星需求专用。先问平台!"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,13 +11,13 @@ trigger: "用户说小改动/加字段/加按钮/改文案/快速出 PRD,或
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-prd-quick — 小改动极速出 Mini-PRD(/wl-prd-quick 命令入口)
|
|
17
17
|
|
|
18
18
|
> 这是 `/wl-prd-quick` 命令的 skill 入口。QoderWork 的 `/` 列表读 skills,
|
|
19
19
|
> 所以本 skill 让 QoderWork 也能用 `/wl-prd-quick`,与 Qoder IDE 保持一致。
|
|
20
|
-
> 完整工作流见同名 command 文件 `.qoder/commands/wl-prd
|
|
20
|
+
> 完整工作流见同名 command 文件 `.qoder/commands/wl-prd.md`,
|
|
21
21
|
> 功能实现层见 `.qoder/skills/prd-generator/SKILL.md`(快档分支)。
|
|
22
22
|
|
|
23
23
|
## ⚠️ STEP 0: 必须先问平台(任何分析前)
|
|
@@ -38,11 +38,11 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
38
38
|
|
|
39
39
|
## 3 步极速流程(详细见 command 文件)
|
|
40
40
|
|
|
41
|
-
1.
|
|
41
|
+
1. **先 prefetch(预测 + 批量预取,禁止串行 search)**:
|
|
42
42
|
```bash
|
|
43
|
-
|
|
44
|
-
python "$R/.qoder/scripts/kg.py" context <词> --platform <p> --role "$ROLE"
|
|
43
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" prefetch "<需求描述>" --platform <p>
|
|
45
44
|
```
|
|
45
|
+
prefetch 一次返回代码/字段/API/Wiki/历史PRD 的合并结果。**之后不要再用 search/find/grep 逐个查词**——那会变成 6+ 次串行往返,是轮次爆炸的根因。prefetch 不够时才补调一次。
|
|
46
46
|
2. 一次 Write:Mini-PRD(prd-quick-template.md,6 章)+ 微型原型(只画 diff)
|
|
47
47
|
3. "出好了,确认发布吗?" → 归档 + push
|
|
48
48
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wl-prd-review
|
|
3
|
-
description: "评审 PRD 完整性与质量(7 项 checklist + EVA
|
|
4
|
-
trigger: "
|
|
3
|
+
description: "评审 PRD 完整性与质量(7 项 checklist + EVA 评分)。"
|
|
4
|
+
trigger: "user invokes /wl-* command explicitly"
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
|
|
@@ -11,12 +11,12 @@ trigger: "用户说要评审/检查/审核 PRD 质量,或直接 /wl-prd-review
|
|
|
11
11
|
```bash
|
|
12
12
|
R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
13
13
|
```
|
|
14
|
-
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python
|
|
14
|
+
> `repo_root.py` 从 `~/.qoderwork/mcp.json` 反推仓库根;失败回退 `.`(IDE/CLI 工作目录即仓库根)。找不到时先跑 `python "$R/.qoder/scripts/orchestration/wlkj.py" install-qw`。
|
|
15
15
|
|
|
16
16
|
# wl-prd-review — 评审 PRD 质量(/wl-prd-review 命令入口)
|
|
17
17
|
|
|
18
18
|
> 这是 `/wl-prd-review` 命令的 skill 入口。
|
|
19
|
-
> 完整工作流见同名 command 文件 `.qoder/commands/wl-prd
|
|
19
|
+
> 完整工作流见同名 command 文件 `.qoder/commands/wl-prd.md`,
|
|
20
20
|
> 评审实现细节见 `.qoder/skills/prd-review/SKILL.md`。
|
|
21
21
|
> **定位:评审已有 PRD,不产出新 PRD。**
|
|
22
22
|
|
|
@@ -24,11 +24,23 @@ R=$(python ~/.qoderwork/repo_root.py 2>/dev/null) || R=.
|
|
|
24
24
|
|
|
25
25
|
拿到一份 PRD,检查它够不够格发布/交付下游:
|
|
26
26
|
1. **7 项 checklist**:用户故事清晰 / 验收可测 / 优先级已标 / 模块已识别 / 非功能已列 / 边界已考虑 / 依赖已识别
|
|
27
|
-
2. **EVA 客观评分**:`python "$R/.qoder/scripts/
|
|
27
|
+
2. **EVA 客观评分**:`python "$R/.qoder/scripts/orchestration/wlkj.py" eval <PRD> [原型]`,≥80% 才 PASS
|
|
28
28
|
3. **合并报告**:PASS → 可发布;不 PASS → 修复清单
|
|
29
29
|
|
|
30
30
|
## 定位要评审的 PRD
|
|
31
31
|
|
|
32
32
|
用户给路径 → 直接 Read;没给 → 扫 `data/docs/prd/` + `workspace/members/*/drafts/` 列出最近 PRD 让用户选。
|
|
33
33
|
|
|
34
|
-
详细流程见 `.qoder/commands/wl-prd
|
|
34
|
+
详细流程见 `.qoder/commands/wl-prd.md`。
|
|
35
|
+
|
|
36
|
+
## ✅ 评审完成后必须埋点(不要跳过)
|
|
37
|
+
|
|
38
|
+
评审报告给出 PASS/不 PASS 结论后,**立即**记录一条 `review_done` 事件——
|
|
39
|
+
这是「可用性指标 F2 转化漏斗」评审级数据的唯一来源,不埋则该级永远为 0:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
python "$R/.qoder/scripts/orchestration/wlkj.py" learn record review_done "{\"prd\": \"<被评审PRD文件名>\", \"verdict\": \"PASS\"}"
|
|
43
|
+
```
|
|
44
|
+
- `verdict`:评审结论,`PASS` 或 `FAIL`
|
|
45
|
+
- 埋点失败不阻塞评审(包在 try 里无所谓),但能埋一定要埋。
|
|
46
|
+
|