@xihe-lab/tapd-cli 2.0.0-rc.1 → 2.0.0-rc.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.
Files changed (175) hide show
  1. package/README.md +22 -0
  2. package/dist/advisor/domain-axis.d.ts +16 -0
  3. package/dist/advisor/domain-axis.d.ts.map +1 -0
  4. package/dist/advisor/domain-axis.js +43 -0
  5. package/dist/advisor/domain-axis.js.map +1 -0
  6. package/dist/advisor/domain-axis.test.d.ts +2 -0
  7. package/dist/advisor/domain-axis.test.d.ts.map +1 -0
  8. package/dist/advisor/domain-axis.test.js +198 -0
  9. package/dist/advisor/domain-axis.test.js.map +1 -0
  10. package/dist/advisor/index.d.ts +8 -0
  11. package/dist/advisor/index.d.ts.map +1 -0
  12. package/dist/advisor/index.js +6 -0
  13. package/dist/advisor/index.js.map +1 -0
  14. package/dist/advisor/persona.d.ts +12 -0
  15. package/dist/advisor/persona.d.ts.map +1 -0
  16. package/dist/advisor/persona.js +34 -0
  17. package/dist/advisor/persona.js.map +1 -0
  18. package/dist/advisor/recall.d.ts +38 -0
  19. package/dist/advisor/recall.d.ts.map +1 -0
  20. package/dist/advisor/recall.js +96 -0
  21. package/dist/advisor/recall.js.map +1 -0
  22. package/dist/advisor/render.d.ts +8 -0
  23. package/dist/advisor/render.d.ts.map +1 -0
  24. package/dist/advisor/render.js +42 -0
  25. package/dist/advisor/render.js.map +1 -0
  26. package/dist/commands/advisor.d.ts.map +1 -1
  27. package/dist/commands/advisor.js +31 -13
  28. package/dist/commands/advisor.js.map +1 -1
  29. package/dist/commands/pipeline.d.ts +4 -0
  30. package/dist/commands/pipeline.d.ts.map +1 -0
  31. package/dist/commands/pipeline.js +178 -0
  32. package/dist/commands/pipeline.js.map +1 -0
  33. package/dist/commands/pm.d.ts +4 -0
  34. package/dist/commands/pm.d.ts.map +1 -0
  35. package/dist/commands/pm.js +175 -0
  36. package/dist/commands/pm.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +8 -0
  40. package/dist/index.js.map +1 -1
  41. package/dist/pipeline/engine.d.ts +38 -0
  42. package/dist/pipeline/engine.d.ts.map +1 -0
  43. package/dist/pipeline/engine.js +326 -0
  44. package/dist/pipeline/engine.js.map +1 -0
  45. package/dist/pipeline/engine.test.d.ts +2 -0
  46. package/dist/pipeline/engine.test.d.ts.map +1 -0
  47. package/dist/pipeline/engine.test.js +419 -0
  48. package/dist/pipeline/engine.test.js.map +1 -0
  49. package/dist/pipeline/expression.d.ts +31 -0
  50. package/dist/pipeline/expression.d.ts.map +1 -0
  51. package/dist/pipeline/expression.js +249 -0
  52. package/dist/pipeline/expression.js.map +1 -0
  53. package/dist/pipeline/expression.test.d.ts +2 -0
  54. package/dist/pipeline/expression.test.d.ts.map +1 -0
  55. package/dist/pipeline/expression.test.js +111 -0
  56. package/dist/pipeline/expression.test.js.map +1 -0
  57. package/dist/pipeline/history.d.ts +13 -0
  58. package/dist/pipeline/history.d.ts.map +1 -0
  59. package/dist/pipeline/history.js +66 -0
  60. package/dist/pipeline/history.js.map +1 -0
  61. package/dist/pipeline/index.d.ts +13 -0
  62. package/dist/pipeline/index.d.ts.map +1 -0
  63. package/dist/pipeline/index.js +9 -0
  64. package/dist/pipeline/index.js.map +1 -0
  65. package/dist/pipeline/record.d.ts +13 -0
  66. package/dist/pipeline/record.d.ts.map +1 -0
  67. package/dist/pipeline/record.js +30 -0
  68. package/dist/pipeline/record.js.map +1 -0
  69. package/dist/pipeline/record.test.d.ts +2 -0
  70. package/dist/pipeline/record.test.d.ts.map +1 -0
  71. package/dist/pipeline/record.test.js +109 -0
  72. package/dist/pipeline/record.test.js.map +1 -0
  73. package/dist/pipeline/template.d.ts +24 -0
  74. package/dist/pipeline/template.d.ts.map +1 -0
  75. package/dist/pipeline/template.js +134 -0
  76. package/dist/pipeline/template.js.map +1 -0
  77. package/dist/pipeline/template.test.d.ts +2 -0
  78. package/dist/pipeline/template.test.d.ts.map +1 -0
  79. package/dist/pipeline/template.test.js +94 -0
  80. package/dist/pipeline/template.test.js.map +1 -0
  81. package/dist/pipeline/types.d.ts +99 -0
  82. package/dist/pipeline/types.d.ts.map +1 -0
  83. package/dist/pipeline/types.js +31 -0
  84. package/dist/pipeline/types.js.map +1 -0
  85. package/dist/pipeline/unwrap.d.ts +3 -0
  86. package/dist/pipeline/unwrap.d.ts.map +1 -0
  87. package/dist/pipeline/unwrap.js +26 -0
  88. package/dist/pipeline/unwrap.js.map +1 -0
  89. package/dist/pipeline/unwrap.test.d.ts +2 -0
  90. package/dist/pipeline/unwrap.test.d.ts.map +1 -0
  91. package/dist/pipeline/unwrap.test.js +36 -0
  92. package/dist/pipeline/unwrap.test.js.map +1 -0
  93. package/dist/pipeline/validate.d.ts +18 -0
  94. package/dist/pipeline/validate.d.ts.map +1 -0
  95. package/dist/pipeline/validate.js +134 -0
  96. package/dist/pipeline/validate.js.map +1 -0
  97. package/dist/pipeline/validate.test.d.ts +2 -0
  98. package/dist/pipeline/validate.test.d.ts.map +1 -0
  99. package/dist/pipeline/validate.test.js +166 -0
  100. package/dist/pipeline/validate.test.js.map +1 -0
  101. package/dist/pm/discovery.d.ts +54 -0
  102. package/dist/pm/discovery.d.ts.map +1 -0
  103. package/dist/pm/discovery.js +198 -0
  104. package/dist/pm/discovery.js.map +1 -0
  105. package/dist/pm/discovery.test.d.ts +2 -0
  106. package/dist/pm/discovery.test.d.ts.map +1 -0
  107. package/dist/pm/discovery.test.js +147 -0
  108. package/dist/pm/discovery.test.js.map +1 -0
  109. package/dist/pm/domains.d.ts +15 -0
  110. package/dist/pm/domains.d.ts.map +1 -0
  111. package/dist/pm/domains.js +27 -0
  112. package/dist/pm/domains.js.map +1 -0
  113. package/dist/pm/domains.test.d.ts +2 -0
  114. package/dist/pm/domains.test.d.ts.map +1 -0
  115. package/dist/pm/domains.test.js +141 -0
  116. package/dist/pm/domains.test.js.map +1 -0
  117. package/dist/pm/index.d.ts +9 -0
  118. package/dist/pm/index.d.ts.map +1 -0
  119. package/dist/pm/index.js +6 -0
  120. package/dist/pm/index.js.map +1 -0
  121. package/dist/pm/iteration.d.ts +26 -0
  122. package/dist/pm/iteration.d.ts.map +1 -0
  123. package/dist/pm/iteration.js +50 -0
  124. package/dist/pm/iteration.js.map +1 -0
  125. package/dist/pm/iteration.test.d.ts +2 -0
  126. package/dist/pm/iteration.test.d.ts.map +1 -0
  127. package/dist/pm/iteration.test.js +125 -0
  128. package/dist/pm/iteration.test.js.map +1 -0
  129. package/dist/pm/pm-command.test.d.ts +2 -0
  130. package/dist/pm/pm-command.test.d.ts.map +1 -0
  131. package/dist/pm/pm-command.test.js +321 -0
  132. package/dist/pm/pm-command.test.js.map +1 -0
  133. package/dist/pm/render.d.ts +17 -0
  134. package/dist/pm/render.d.ts.map +1 -0
  135. package/dist/pm/render.js +82 -0
  136. package/dist/pm/render.js.map +1 -0
  137. package/dist/pm/tpl-communication-stakeholder.test.d.ts +2 -0
  138. package/dist/pm/tpl-communication-stakeholder.test.d.ts.map +1 -0
  139. package/dist/pm/tpl-communication-stakeholder.test.js +392 -0
  140. package/dist/pm/tpl-communication-stakeholder.test.js.map +1 -0
  141. package/dist/pm/tpl-integration-scope.test.d.ts +2 -0
  142. package/dist/pm/tpl-integration-scope.test.d.ts.map +1 -0
  143. package/dist/pm/tpl-integration-scope.test.js +387 -0
  144. package/dist/pm/tpl-integration-scope.test.js.map +1 -0
  145. package/dist/pm/tpl-quality-risk.test.d.ts +2 -0
  146. package/dist/pm/tpl-quality-risk.test.d.ts.map +1 -0
  147. package/dist/pm/tpl-quality-risk.test.js +414 -0
  148. package/dist/pm/tpl-quality-risk.test.js.map +1 -0
  149. package/dist/pm/tpl-schedule-cost.test.d.ts +2 -0
  150. package/dist/pm/tpl-schedule-cost.test.d.ts.map +1 -0
  151. package/dist/pm/tpl-schedule-cost.test.js +376 -0
  152. package/dist/pm/tpl-schedule-cost.test.js.map +1 -0
  153. package/dist/program.d.ts.map +1 -1
  154. package/dist/program.js +6 -0
  155. package/dist/program.js.map +1 -1
  156. package/package.json +11 -6
  157. package/templates/deliver-story.yaml +38 -0
  158. package/templates/iteration-review.yaml +52 -0
  159. package/templates/pm/README.md +57 -0
  160. package/templates/pm/communication-notify.yaml +65 -0
  161. package/templates/pm/communication-weekly.yaml +160 -0
  162. package/templates/pm/cost-report.yaml +74 -0
  163. package/templates/pm/integration-close.yaml +118 -0
  164. package/templates/pm/integration-health.yaml +155 -0
  165. package/templates/pm/integration-kickoff.yaml +94 -0
  166. package/templates/pm/quality-dashboard.yaml +88 -0
  167. package/templates/pm/quality-triage.yaml +42 -0
  168. package/templates/pm/risk-register.yaml +55 -0
  169. package/templates/pm/risk-scan.yaml +87 -0
  170. package/templates/pm/schedule-burndown.yaml +87 -0
  171. package/templates/pm/schedule-standup.yaml +109 -0
  172. package/templates/pm/scope-baseline.yaml +93 -0
  173. package/templates/pm/scope-drift-check.yaml +129 -0
  174. package/templates/pm/stakeholder-map.yaml +121 -0
  175. package/templates/triage-bugs.yaml +49 -0
@@ -0,0 +1,414 @@
1
+ // S5 场景模板集成测试:quality-dashboard / quality-triage / risk-scan / risk-register
2
+ //
3
+ // 口径:直接加载内置 templates/pm/*.yaml(discoverPmTemplates + loadPmTemplate 剥 domain),
4
+ // 逐一过 validateTemplate 静态校验与 runPipeline 真实执行(mock registry,不触 API);
5
+ // CLI 链路(pm list / 别名 --dry-run / 写闸门 exit 2)用 buildProgram 走 S2 同构路径。
6
+ // TAPD_RICHTEXT_AUTO='0':关闭 core 富文本自动转换,断言模板注入的原始参数( richtext
7
+ // 转换属 core 自身行为,已在 core 侧覆盖)。
8
+ import assert from 'node:assert/strict';
9
+ import { mkdtempSync, mkdirSync, rmSync } from 'node:fs';
10
+ import { tmpdir } from 'node:os';
11
+ import path from 'node:path';
12
+ import { z } from 'zod';
13
+ import { ToolRegistry } from '@xihe-lab/tapd-core';
14
+ import { discoverPmTemplates, loadPmTemplate, resolvePmEntry } from './discovery.js';
15
+ import { validateTemplate } from '../pipeline/validate.js';
16
+ import { runPipeline } from '../pipeline/engine.js';
17
+ import { buildProgram } from '../program.js';
18
+ // ---- fixtures(含 zzz 脏数据 / 风险项 / 各状态控制组) ----
19
+ const ITERATIONS = [
20
+ { id: '5001', name: 'Sprint Q3', startdate: '2026-09-01', enddate: '2026-09-30', status: 'open' },
21
+ ];
22
+ // dashboard:3 有效 + 1 zzz;未解 = b1(b2 resolved / b3 closed 不算)
23
+ const DASH_BUGS = [
24
+ { id: 'b1', title: '登录失败', severity: '1', status: 'new', priority_label: 'High', current_owner: 'alice', te: 'tester-a', de: 'dev-a', deadline: '2026-01-01' },
25
+ { id: 'b2', title: '列表错位', severity: '2', status: 'resolved', priority_label: 'Middle', current_owner: 'bob', te: 'tester-a', de: 'dev-b', deadline: '' },
26
+ { id: 'b3', title: '文案错字', severity: '3', status: 'closed', priority_label: 'Low', current_owner: 'bob', te: 'tester-b', de: 'dev-b', deadline: '' },
27
+ { id: 'b4', title: 'zzz-delete-me 脏缺陷', severity: '4', status: 'new', priority_label: 'Low', current_owner: '', te: '', de: '', deadline: '' },
28
+ ];
29
+ // dashboard:分母 = 2(s3 为【风险】项、s4 为 zzz 脏数据,均剔除)
30
+ const DASH_STORIES = [
31
+ { id: 's1', name: '需求甲', status: 'new', owner: 'dev-a' },
32
+ { id: 's2', name: '需求乙', status: 'done', owner: 'dev-b' },
33
+ { id: 's3', name: '【风险】压测演练', status: 'new', owner: 'dev-a' },
34
+ { id: 's4', name: 'zzz-delete-me 脏需求', status: 'new', owner: '' },
35
+ ];
36
+ // triage:未解 4 = 高严重度 1(t1)+ 其余 3;t5 已解、t6 为 zzz
37
+ const TRIAGE_BUGS = [
38
+ { id: 't1', title: '资损缺陷', severity: '1', status: 'new', priority_label: 'Urgent', current_owner: 'alice', te: 'tester-a', de: 'dev-a' },
39
+ { id: 't2', title: '导出超时', severity: '3', status: 'new', priority_label: 'Middle', current_owner: 'bob', te: 'tester-b', de: 'dev-b' },
40
+ { id: 't3', title: '按钮遮挡', severity: '4', status: 'new', priority_label: 'Low', current_owner: 'alice', te: 'tester-a', de: 'dev-a' },
41
+ { id: 't4', title: '日志缺失', severity: '5', status: 'new', priority_label: 'Low', current_owner: '', te: '', de: '' },
42
+ { id: 't5', title: '已解缺陷', severity: '1', status: 'resolved', priority_label: 'High', current_owner: 'alice', te: 'tester-a', de: 'dev-a' },
43
+ { id: 't6', title: 'zzz-delete-me 脏缺陷', severity: '1', status: 'new', priority_label: 'Low', current_owner: '', te: '', de: '' },
44
+ ];
45
+ // scan:任务 k1 逾期+超支50%、k2 正常、k3 done(不逾期)但超支10%、k4 zzz
46
+ const SCAN_TASKS = [
47
+ { id: 'k1', name: '任务A', owner: 'alice', status: 'progressing', due: '2026-01-01', effort: '10', exceed: '5' },
48
+ { id: 'k2', name: '任务B', owner: 'bob', status: 'progressing', due: '2999-01-01', effort: '10', exceed: '0' },
49
+ { id: 'k3', name: '任务C', owner: 'bob', status: 'done', due: '2026-01-02', effort: '10', exceed: '1' },
50
+ { id: 'k4', name: 'zzz-delete-me 脏任务', owner: '', status: 'progressing', due: '2026-01-01', effort: '1', exceed: '1' },
51
+ ];
52
+ // scan:g1 逾期未解、g2 未到期、g3 逾期但已解(控制组)
53
+ const SCAN_BUGS = [
54
+ { id: 'g1', title: '资损缺陷', severity: '1', status: 'new', current_owner: 'alice', deadline: '2026-01-01' },
55
+ { id: 'g2', title: '普通缺陷', severity: '2', status: 'new', current_owner: 'bob', deadline: '2999-01-01' },
56
+ { id: 'g3', title: '已解缺陷', severity: '3', status: 'closed', current_owner: 'bob', deadline: '2026-01-01' },
57
+ ];
58
+ const SCAN_BLOCKED = [
59
+ { id: 'i1', tcase_id: '9001', test_plan_id: 'tp-9', result: 'block', executed_by: 'qa1', executed: '2026-09-01' },
60
+ ];
61
+ // scan:st1 被前置阻塞(st2 未完成、st3 已完成、r3 前置在迭代外)、st2 外部来源、st3 done 控制组、st4 zzz
62
+ const SCAN_STORIES = [
63
+ { id: 'st1', name: '需求甲', status: 'new', owner: 'dev-a', source: '' },
64
+ { id: 'st2', name: '需求乙', status: 'new', owner: 'dev-b', source: '客户A' },
65
+ { id: 'st3', name: '需求丙', status: 'done', owner: 'dev-a', source: '' },
66
+ { id: 'st4', name: 'zzz-delete-me 脏需求', status: 'new', owner: '', source: '' },
67
+ ];
68
+ const SCAN_RELATIONS = [
69
+ { predecessor_id: 'st3', successor_id: 'st1', relation_type: '1' },
70
+ { predecessor_id: 'st2', successor_id: 'st1', relation_type: '1' },
71
+ { predecessor_id: 'ext-999', successor_id: 'st1', relation_type: '2' },
72
+ ];
73
+ const TEST_PLAN = { total: 10, passed: 6, pass_rate: '60%' };
74
+ function makeRegistry(fixtures = {}) {
75
+ const fx = { iterations: ITERATIONS, bugs: DASH_BUGS, stories: DASH_STORIES, tasks: SCAN_TASKS, blocked: SCAN_BLOCKED, relations: SCAN_RELATIONS, testPlan: TEST_PLAN, ...fixtures };
76
+ const trackers = { bugs: [], stories: [], tasks: [], blocked: [], relations: [], testPlans: [], createStory: [] };
77
+ const tools = [
78
+ {
79
+ name: 'tapd_get_iterations',
80
+ description: 'mock: 迭代查询',
81
+ inputSchema: z.object({ workspace_id: z.number().optional(), id: z.string().optional(), status: z.string().optional(), fields: z.string().optional() }),
82
+ handler: () => Promise.resolve(fx.iterations),
83
+ },
84
+ {
85
+ name: 'tapd_get_bugs',
86
+ description: 'mock: 缺陷查询(记录入参)',
87
+ inputSchema: z.object({ workspace_id: z.number().optional(), id: z.string().optional(), iteration_id: z.string().optional(), limit: z.number().optional(), fields: z.string().optional(), status: z.string().optional(), severity: z.string().optional(), deadline: z.string().optional(), label: z.string().optional() }),
88
+ handler: (_c, p) => { trackers.bugs.push(p); return Promise.resolve(fx.bugs); },
89
+ },
90
+ {
91
+ name: 'tapd_get_stories',
92
+ description: 'mock: 需求查询(记录入参)',
93
+ inputSchema: z.object({ workspace_id: z.number().optional(), iteration_id: z.string().optional(), limit: z.number().optional(), fields: z.string().optional(), status: z.string().optional() }),
94
+ handler: (_c, p) => { trackers.stories.push(p); return Promise.resolve(fx.stories); },
95
+ },
96
+ {
97
+ name: 'tapd_get_tasks',
98
+ description: 'mock: 任务查询(记录入参)',
99
+ inputSchema: z.object({ workspace_id: z.number().optional(), iteration_id: z.string().optional(), limit: z.number().optional(), fields: z.string().optional(), status: z.string().optional(), due: z.string().optional() }),
100
+ handler: (_c, p) => { trackers.tasks.push(p); return Promise.resolve(fx.tasks); },
101
+ },
102
+ {
103
+ name: 'tapd_get_tcase_result',
104
+ description: 'mock: 用例执行结果(记录入参)',
105
+ inputSchema: z.object({ workspace_id: z.number().optional(), tcase_id: z.string().optional(), test_plan_id: z.string().optional(), result: z.string().optional(), limit: z.number().optional(), fields: z.string().optional() }),
106
+ handler: (_c, p) => { trackers.blocked.push(p); return Promise.resolve(fx.blocked); },
107
+ },
108
+ {
109
+ name: 'tapd_get_time_relative_stories',
110
+ description: 'mock: 需求前后置关系(记录入参)',
111
+ inputSchema: z.object({ workspace_id: z.number().optional(), story_id: z.string().optional(), predecessor_id: z.string().optional(), successor_id: z.string().optional(), limit: z.number().optional(), fields: z.string().optional() }),
112
+ handler: (_c, p) => { trackers.relations.push(p); return Promise.resolve(fx.relations); },
113
+ },
114
+ {
115
+ name: 'tapd_get_test_plan_progress',
116
+ description: 'mock: 测试计划进度(记录入参)',
117
+ inputSchema: z.object({ workspace_id: z.number().optional(), test_plan_id: z.string() }),
118
+ handler: (_c, p) => { trackers.testPlans.push(p); return Promise.resolve(fx.testPlan); },
119
+ },
120
+ {
121
+ name: 'tapd_create_story',
122
+ description: 'mock: 创建需求(写,记录入参)',
123
+ inputSchema: z.object({ workspace_id: z.number().optional(), name: z.string(), description: z.string().optional(), iteration_id: z.string().optional(), label: z.string().optional(), priority_label: z.string().optional(), owner: z.string().optional() }),
124
+ handler: (_c, p) => { trackers.createStory.push(p); return Promise.resolve({ id: 'new-1', name: p.name }); },
125
+ },
126
+ ];
127
+ const registry = new ToolRegistry();
128
+ registry.register(tools);
129
+ return { registry, trackers };
130
+ }
131
+ async function loadAndRun(domain, scenario, opts = {}) {
132
+ const { registry, trackers } = makeRegistry(opts.fixtures);
133
+ const entry = resolvePmEntry(discoverPmTemplates(), domain, scenario);
134
+ const { template } = loadPmTemplate(entry);
135
+ const summary = await runPipeline(template, {
136
+ registry,
137
+ clientFactory: (() => ({})),
138
+ vars: { iteration_id: '5001', ...opts.vars },
139
+ yes: opts.yes === true,
140
+ });
141
+ return {
142
+ template,
143
+ steps: id => {
144
+ const s = summary.steps.find(x => x.id === id);
145
+ assert.ok(s, `步骤 ${id} 存在于运行结果`);
146
+ return s;
147
+ },
148
+ report: typeof summary.report === 'string' ? summary.report : '',
149
+ trackers,
150
+ };
151
+ }
152
+ // ---- env 隔离(用户模板目录清空 → 只测 builtin;关富文本自动转换) ----
153
+ const userDir = mkdtempSync(path.join(tmpdir(), 'tapd-pm-s5-'));
154
+ mkdirSync(path.join(userDir, 'pm'), { recursive: true });
155
+ const saved = {
156
+ userDir: process.env.TAPD_USER_TEMPLATES_DIR,
157
+ token: process.env.TAPD_ACCESS_TOKEN,
158
+ richtext: process.env.TAPD_RICHTEXT_AUTO,
159
+ };
160
+ process.env.TAPD_USER_TEMPLATES_DIR = userDir;
161
+ process.env.TAPD_ACCESS_TOKEN = 'pm-s5-test-token';
162
+ process.env.TAPD_RICHTEXT_AUTO = '0';
163
+ const checks = [
164
+ ['发现:四模板进 builtin 目录且域/场景/读写标记正确', () => {
165
+ const entries = discoverPmTemplates().entries;
166
+ const expect = [
167
+ ['quality', 'dashboard', false],
168
+ ['quality', 'triage', false],
169
+ ['risk', 'scan', false],
170
+ ['risk', 'register', true],
171
+ ];
172
+ for (const [domain, scenario, write] of expect) {
173
+ const hit = entries.find(e => e.domain === domain && e.scenario === scenario);
174
+ assert.ok(hit, `pm ${domain} ${scenario} 被发现`);
175
+ assert.equal(hit.source, 'builtin');
176
+ assert.equal(hit.write, write, `pm ${domain} ${scenario} write 标记`);
177
+ assert.equal(hit.name, `${domain}-${scenario}`, '模板名与文件名 stem 一致');
178
+ assert.ok(hit.title.length > 0, 'title 非空(help/list 展示用)');
179
+ }
180
+ }],
181
+ ['静态校验:四模板 0 error;writeSteps 仅 risk-register 含 register', () => {
182
+ const { registry } = makeRegistry();
183
+ const catalog = discoverPmTemplates();
184
+ for (const [domain, scenario, write] of [['quality', 'dashboard', []], ['quality', 'triage', []], ['risk', 'scan', []], ['risk', 'register', ['register']]]) {
185
+ const entry = resolvePmEntry(catalog, domain, scenario);
186
+ const { template } = loadPmTemplate(entry);
187
+ const result = validateTemplate(template, registry);
188
+ assert.deepEqual(result.errors, [], `${domain}-${scenario} 校验 0 error`);
189
+ assert.deepEqual(result.writeSteps, [...write], `${domain}-${scenario} 写步骤判定`);
190
+ }
191
+ }],
192
+ ['quality-dashboard:密度保留分母、风险/脏数据剔除、矩阵与未解清单、缺 test_plan_id 注明跳过', async () => {
193
+ const r = await loadAndRun('quality', 'dashboard');
194
+ assert.ok(r.steps('bugs').status === 'ok' && r.steps('bugs').write === false);
195
+ assert.equal(r.steps('test_plan').status, 'skipped', '未传 test_plan_id 时跳过');
196
+ assert.equal(r.steps('test_plan').skipReason, 'where');
197
+ // 密度:全量 3(b4 zzz 已滤)/ 需求 2(s3 风险、s4 zzz 已滤)
198
+ assert.equal(r.steps('stats').data && r.steps('stats').data.densityText, '3/2');
199
+ const report = r.report;
200
+ assert.ok(report.includes('缺陷密度(有效缺陷/需求,保留分母): 3/2'), report);
201
+ assert.ok(report.includes('severity × status 分布'), report);
202
+ assert.ok(report.includes('| 严重度 | closed | new | resolved | 合计 |'), `矩阵表头按状态分列:\n${report}`);
203
+ assert.ok(report.includes('| 1 | 0 | 1 | 0 | 1 |'), 'severity=1 行计数');
204
+ assert.ok(report.includes('b1') && !report.includes('b4'), '未解清单含 b1、不含 zzz 缺陷 b4');
205
+ assert.ok(!report.includes('【风险】压测演练'), '需求分母剔除【风险】项');
206
+ assert.ok(report.includes('已跳过测试计划执行进度'), report);
207
+ }],
208
+ ['quality-dashboard:--input test_plan_id 注入后执行进度查询', async () => {
209
+ const r = await loadAndRun('quality', 'dashboard', { vars: { test_plan_id: 'tp-9' } });
210
+ assert.equal(r.steps('test_plan').status, 'ok');
211
+ assert.equal(r.trackers.testPlans.length, 1);
212
+ assert.equal(r.trackers.testPlans[0].test_plan_id, 'tp-9');
213
+ assert.ok(r.report.includes('60%'), r.report);
214
+ }],
215
+ ['quality-triage:高严重度→te、其余负载均衡、建议模式文案、零写步骤', async () => {
216
+ const r = await loadAndRun('quality', 'triage', { fixtures: { bugs: TRIAGE_BUGS } });
217
+ assert.ok(r.steps('triage').status === 'ok' && !r.steps('bugs').write && !r.steps('triage').write);
218
+ const triage = r.steps('triage').data;
219
+ assert.equal(triage.openCount, 4, '未解 = t1..t4(t5 已解、t6 zzz)');
220
+ assert.equal(triage.highCount, 1);
221
+ assert.equal(triage.restCount, 3);
222
+ assert.equal(triage.owners.join(','), 'alice,bob', '候选处理人池 = 未解缺陷的 current_owner 去重');
223
+ const byId = new Map(triage.plan.map(p => [p.id, p]));
224
+ assert.equal(byId.get('t1').suggested, 'tester-a', '高严重度 → te');
225
+ assert.equal(byId.get('t1').rule, '高严重度→te');
226
+ // 负载均衡:初始 alice=1(t3)/bob=1(t2),依次分给当前负载最小者
227
+ assert.equal(byId.get('t2').suggested, 'alice');
228
+ assert.equal(byId.get('t3').suggested, 'bob');
229
+ assert.equal(byId.get('t4').suggested, 'alice');
230
+ assert.ok(byId.get('t4').rule === '按 current_owner 负载均衡');
231
+ assert.ok(r.report.includes('建议模式'), r.report);
232
+ assert.ok(r.report.includes('bug update'), '注明确认后人工/agent 执行 bug update');
233
+ assert.ok(!r.report.includes('zzz-delete-me'), 'zzz 脏数据已过滤');
234
+ }],
235
+ ['risk-scan:六路命中 + 控制组排除 + 候选表(类别/描述/证据/建议等级)', async () => {
236
+ // blocked/relations 自 L2 真机修复后为 opt-in(tcase_result/time_relative_stories 需实体级参数),
237
+ // 显式传入三参以保持「六路命中」测试意图;默认缺省路径的降级见后续 dry-run/默认行为断言。
238
+ const r = await loadAndRun('risk', 'scan', {
239
+ vars: { tcase_id: 'tc-1', test_plan_id: 'tp-1', relations_story_id: '1139814312001001539' },
240
+ fixtures: { bugs: SCAN_BUGS, stories: SCAN_STORIES },
241
+ });
242
+ assert.ok(r.steps('scan').status === 'ok');
243
+ for (const id of ['tasks', 'bugs', 'blocked', 'stories', 'relations']) {
244
+ assert.equal(r.steps(id).status, 'ok', `数据源 ${id} 执行`);
245
+ }
246
+ const scan = r.steps('scan').data;
247
+ // ①k1 ④k1(50%→高)/k3(10%→中) ②g1 ③c1 ⑤r2+r3(迭代外) ⑥st2
248
+ assert.equal(scan.total, 8);
249
+ assert.ok(scan.categorySummary.includes('进度 1') && scan.categorySummary.includes('成本 2') && scan.categorySummary.includes('质量 2') && scan.categorySummary.includes('依赖 3'), scan.categorySummary);
250
+ const kinds = scan.findings.map(f => f.kind);
251
+ assert.equal(kinds.filter(k => k === '逾期任务').length, 1);
252
+ assert.equal(kinds.filter(k => k === '超支任务').length, 2);
253
+ assert.equal(kinds.filter(k => k === '逾期缺陷').length, 1);
254
+ assert.equal(kinds.filter(k => k === '阻塞用例').length, 1);
255
+ assert.equal(kinds.filter(k => k === '依赖停滞').length, 2);
256
+ assert.equal(kinds.filter(k => k === '外部依赖').length, 1);
257
+ const byId = new Map(scan.findings.map(f => [f.id + ':' + f.kind, f]));
258
+ assert.equal(byId.get('k1:超支任务').level, '高', '超支 50% → 高');
259
+ assert.equal(byId.get('k3:超支任务').level, '中', '超支 10% → 中');
260
+ assert.equal(byId.get('g1:逾期缺陷').level, '高', 'severity=1 逾期缺陷 → 高');
261
+ assert.ok(byId.get('st1:依赖停滞'), '后置 st1 的依赖停滞被命中');
262
+ assert.ok(scan.findings.some(f => f.kind === '依赖停滞' && f.desc.includes('(迭代外)')), '迭代外前置也计入停滞');
263
+ const report = r.report;
264
+ assert.ok(report.includes('候选风险: 8 项'), report);
265
+ assert.ok(report.includes('| 类别 | 类型 | 对象 | 描述 | 证据 | 建议等级 |'), '候选表列头');
266
+ assert.ok(report.includes('人工裁决'), '注明输出供人工裁决');
267
+ assert.ok(report.includes('pm risk register'), '去向:确认后用 risk register 登记');
268
+ // 控制组不出现在报告
269
+ for (const absent of ['任务B', '需求丙', 'g3', 'g2', 'zzz-delete-me']) {
270
+ assert.ok(!report.includes(absent), `报告不含控制组/脏数据: ${absent}`);
271
+ }
272
+ assert.ok(r.steps('scan').write === false && scan.findings.length >= 0, '本模板零写步骤');
273
+ }],
274
+ ['risk-register:未 --yes 被写闸门拦截,零落库', async () => {
275
+ const r = await loadAndRun('risk', 'register', {
276
+ vars: { title: '联调环境不可用', category: '进度', probability: '高', impact: '里程碑延期', strategy: '规避', owner: 'alice', trigger: '环境连续 3 天不可用' },
277
+ });
278
+ assert.equal(r.trackers.createStory.length, 0, '未 --yes 不落库');
279
+ assert.equal(r.steps('register').status, 'skipped');
280
+ }],
281
+ ['risk-register:--yes 落库【风险】需求,priority_label 按概率映射、description 组装完整', async () => {
282
+ const r = await loadAndRun('risk', 'register', {
283
+ yes: true,
284
+ vars: { title: '联调环境不可用', category: '进度', probability: '高', impact: '里程碑延期', strategy: '规避', owner: 'alice', trigger: '环境连续 3 天不可用' },
285
+ });
286
+ assert.equal(r.trackers.createStory.length, 1);
287
+ const args = r.trackers.createStory[0];
288
+ assert.equal(args.name, '【风险】联调环境不可用');
289
+ assert.equal(args.label, 'risk');
290
+ assert.equal(args.iteration_id, '5001');
291
+ assert.equal(args.priority_label, 'High', '概率「高」→ High');
292
+ const desc = String(args.description);
293
+ for (const frag of ['- 类别: 进度', '- 概率×影响: 高 × 里程碑延期(priority_label=High)', '- 触发条件: 环境连续 3 天不可用', '- 应对策略: 规避', '- 责任人: alice', '- 关联迭代: 5001', 'label=risk']) {
294
+ assert.ok(desc.includes(frag), `描述含片段: ${frag}\n${desc}`);
295
+ }
296
+ assert.ok(r.report.includes('新需求 id: new-1'), r.report);
297
+ assert.ok(r.report.includes('登记后会在范围度量中被剔除'), '报告注明范围度量剔除口径');
298
+ assert.ok(r.report.includes('【风险】联调环境不可用'), '报告含 markdown 预览标题');
299
+ }],
300
+ ['risk-register:probability 低/未知 → Low/Middle 兜底', async () => {
301
+ const low = await loadAndRun('risk', 'register', { yes: true, vars: { title: 'X', probability: 'low' } });
302
+ assert.equal(low.trackers.createStory[0].priority_label, 'Low');
303
+ const unknown = await loadAndRun('risk', 'register', { yes: true, vars: { title: 'Y', probability: '玄学' } });
304
+ assert.equal(unknown.trackers.createStory[0].priority_label, 'Middle', '未识别概率默认 Middle');
305
+ }],
306
+ ['risk-register:缺 title 时写步骤被 where 跳过,报告注明补参方式', async () => {
307
+ const r = await loadAndRun('risk', 'register', { yes: true, vars: { title: '' } });
308
+ assert.equal(r.trackers.createStory.length, 0, '缺 title 不落库');
309
+ const register = r.steps('register');
310
+ assert.equal(register.status, 'skipped');
311
+ assert.equal(register.skipReason, 'where');
312
+ assert.ok(r.report.includes('被跳过'), r.report);
313
+ }],
314
+ ['CLI:pm list 收录四场景(builtin 来源)', async () => {
315
+ const { registry } = makeRegistry();
316
+ const program = buildProgram(registry, {});
317
+ const out = [];
318
+ const orig = process.stdout.write.bind(process.stdout);
319
+ process.stdout.write = (c) => { out.push(String(c)); return true; };
320
+ const prev = process.exitCode;
321
+ try {
322
+ await program.parseAsync(['node', 'tapd', 'pm', 'list']);
323
+ }
324
+ finally {
325
+ process.stdout.write = orig;
326
+ process.exitCode = prev;
327
+ }
328
+ const list = out.join('');
329
+ assert.match(list, /^quality\s+dashboard\s+read\s+builtin\s+/m);
330
+ assert.match(list, /^quality\s+triage\s+read\s+builtin\s+/m);
331
+ assert.match(list, /^risk\s+scan\s+read\s+builtin\s+/m);
332
+ assert.match(list, /^risk\s+register\s+write\s+builtin\s+/m);
333
+ }],
334
+ ['CLI:pm quality dashboard --dry-run 打印预览且不执行业务步骤', async () => {
335
+ const { registry, trackers } = makeRegistry();
336
+ const program = buildProgram(registry, {});
337
+ const out = [];
338
+ const orig = process.stdout.write.bind(process.stdout);
339
+ process.stdout.write = (c) => { out.push(String(c)); return true; };
340
+ const prev = process.exitCode ?? 0;
341
+ try {
342
+ await program.parseAsync(['node', 'tapd', 'pm', 'quality', 'dashboard', '--dry-run', '--iteration', '5001']);
343
+ }
344
+ finally {
345
+ process.stdout.write = orig;
346
+ process.exitCode = prev;
347
+ }
348
+ const preview = out.join('');
349
+ assert.ok(preview.includes('dry-run'), preview);
350
+ assert.ok(preview.includes('pipeline: quality-dashboard'), preview);
351
+ assert.ok(preview.includes('[read] bugs (tapd_get_bugs)'), preview);
352
+ assert.equal(trackers.bugs.length, 0, 'dry-run 不执行业务步骤');
353
+ }],
354
+ ['CLI:pm risk register 未 --yes → WRITE_GATE 预览 + 退出码 2', async () => {
355
+ const { registry, trackers } = makeRegistry();
356
+ const program = buildProgram(registry, {});
357
+ const out = [];
358
+ const err = [];
359
+ const origOut = process.stdout.write.bind(process.stdout);
360
+ const origErr = process.stderr.write.bind(process.stderr);
361
+ const prev = process.exitCode ?? 0;
362
+ let code;
363
+ try {
364
+ process.stdout.write = (c) => { out.push(String(c)); return true; };
365
+ process.stderr.write = (c) => { err.push(String(c)); return true; };
366
+ await program.parseAsync(['node', 'tapd', 'pm', 'risk', 'register', '--iteration', '5001']);
367
+ code = typeof process.exitCode === 'number' ? process.exitCode : undefined;
368
+ }
369
+ finally {
370
+ process.stdout.write = origOut;
371
+ process.stderr.write = origErr;
372
+ process.exitCode = prev;
373
+ }
374
+ assert.ok(err.join('').includes('WRITE_GATE'), err.join(''));
375
+ assert.ok(out.join('').includes('write gate'), '闸门预览输出');
376
+ assert.equal(code, 2, 'USAGE 退出码(写闸门拒绝)');
377
+ assert.equal(trackers.createStory.length, 0);
378
+ }],
379
+ ];
380
+ let failed = 0;
381
+ try {
382
+ for (const [name, fn] of checks) {
383
+ try {
384
+ await fn();
385
+ console.log(`ok - ${name}`);
386
+ }
387
+ catch (error) {
388
+ failed++;
389
+ console.error(`FAIL - ${name}`);
390
+ console.error(error);
391
+ }
392
+ }
393
+ }
394
+ finally {
395
+ if (saved.userDir === undefined)
396
+ delete process.env.TAPD_USER_TEMPLATES_DIR;
397
+ else
398
+ process.env.TAPD_USER_TEMPLATES_DIR = saved.userDir;
399
+ if (saved.token === undefined)
400
+ delete process.env.TAPD_ACCESS_TOKEN;
401
+ else
402
+ process.env.TAPD_ACCESS_TOKEN = saved.token;
403
+ if (saved.richtext === undefined)
404
+ delete process.env.TAPD_RICHTEXT_AUTO;
405
+ else
406
+ process.env.TAPD_RICHTEXT_AUTO = saved.richtext;
407
+ rmSync(userDir, { recursive: true, force: true });
408
+ }
409
+ if (failed > 0) {
410
+ console.error(`\n${failed}/${checks.length} failed`);
411
+ process.exit(1);
412
+ }
413
+ console.log(`\n${checks.length}/${checks.length} passed`);
414
+ //# sourceMappingURL=tpl-quality-risk.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tpl-quality-risk.test.js","sourceRoot":"","sources":["../../src/pm/tpl-quality-risk.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tpl-schedule-cost.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tpl-schedule-cost.test.d.ts","sourceRoot":"","sources":["../../src/pm/tpl-schedule-cost.test.ts"],"names":[],"mappings":""}