@xihe-lab/tapd-cli 2.0.0-rc.5 → 2.0.0-rc.7

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 (71) hide show
  1. package/LICENSE +16 -4
  2. package/README.md +13 -1
  3. package/package.json +7 -4
  4. package/dist/advisor/domain-axis.test.d.ts +0 -2
  5. package/dist/advisor/domain-axis.test.d.ts.map +0 -1
  6. package/dist/advisor/domain-axis.test.js +0 -198
  7. package/dist/advisor/domain-axis.test.js.map +0 -1
  8. package/dist/flags.test.d.ts +0 -2
  9. package/dist/flags.test.d.ts.map +0 -1
  10. package/dist/flags.test.js +0 -56
  11. package/dist/flags.test.js.map +0 -1
  12. package/dist/output/formatter.test.d.ts +0 -2
  13. package/dist/output/formatter.test.d.ts.map +0 -1
  14. package/dist/output/formatter.test.js +0 -170
  15. package/dist/output/formatter.test.js.map +0 -1
  16. package/dist/pipeline/engine.test.d.ts +0 -2
  17. package/dist/pipeline/engine.test.d.ts.map +0 -1
  18. package/dist/pipeline/engine.test.js +0 -419
  19. package/dist/pipeline/engine.test.js.map +0 -1
  20. package/dist/pipeline/expression.test.d.ts +0 -2
  21. package/dist/pipeline/expression.test.d.ts.map +0 -1
  22. package/dist/pipeline/expression.test.js +0 -111
  23. package/dist/pipeline/expression.test.js.map +0 -1
  24. package/dist/pipeline/record.test.d.ts +0 -2
  25. package/dist/pipeline/record.test.d.ts.map +0 -1
  26. package/dist/pipeline/record.test.js +0 -109
  27. package/dist/pipeline/record.test.js.map +0 -1
  28. package/dist/pipeline/template.test.d.ts +0 -2
  29. package/dist/pipeline/template.test.d.ts.map +0 -1
  30. package/dist/pipeline/template.test.js +0 -94
  31. package/dist/pipeline/template.test.js.map +0 -1
  32. package/dist/pipeline/unwrap.test.d.ts +0 -2
  33. package/dist/pipeline/unwrap.test.d.ts.map +0 -1
  34. package/dist/pipeline/unwrap.test.js +0 -36
  35. package/dist/pipeline/unwrap.test.js.map +0 -1
  36. package/dist/pipeline/validate.test.d.ts +0 -2
  37. package/dist/pipeline/validate.test.d.ts.map +0 -1
  38. package/dist/pipeline/validate.test.js +0 -166
  39. package/dist/pipeline/validate.test.js.map +0 -1
  40. package/dist/pm/discovery.test.d.ts +0 -2
  41. package/dist/pm/discovery.test.d.ts.map +0 -1
  42. package/dist/pm/discovery.test.js +0 -147
  43. package/dist/pm/discovery.test.js.map +0 -1
  44. package/dist/pm/domains.test.d.ts +0 -2
  45. package/dist/pm/domains.test.d.ts.map +0 -1
  46. package/dist/pm/domains.test.js +0 -141
  47. package/dist/pm/domains.test.js.map +0 -1
  48. package/dist/pm/iteration.test.d.ts +0 -2
  49. package/dist/pm/iteration.test.d.ts.map +0 -1
  50. package/dist/pm/iteration.test.js +0 -125
  51. package/dist/pm/iteration.test.js.map +0 -1
  52. package/dist/pm/pm-command.test.d.ts +0 -2
  53. package/dist/pm/pm-command.test.d.ts.map +0 -1
  54. package/dist/pm/pm-command.test.js +0 -321
  55. package/dist/pm/pm-command.test.js.map +0 -1
  56. package/dist/pm/tpl-communication-stakeholder.test.d.ts +0 -2
  57. package/dist/pm/tpl-communication-stakeholder.test.d.ts.map +0 -1
  58. package/dist/pm/tpl-communication-stakeholder.test.js +0 -392
  59. package/dist/pm/tpl-communication-stakeholder.test.js.map +0 -1
  60. package/dist/pm/tpl-integration-scope.test.d.ts +0 -2
  61. package/dist/pm/tpl-integration-scope.test.d.ts.map +0 -1
  62. package/dist/pm/tpl-integration-scope.test.js +0 -387
  63. package/dist/pm/tpl-integration-scope.test.js.map +0 -1
  64. package/dist/pm/tpl-quality-risk.test.d.ts +0 -2
  65. package/dist/pm/tpl-quality-risk.test.d.ts.map +0 -1
  66. package/dist/pm/tpl-quality-risk.test.js +0 -414
  67. package/dist/pm/tpl-quality-risk.test.js.map +0 -1
  68. package/dist/pm/tpl-schedule-cost.test.d.ts +0 -2
  69. package/dist/pm/tpl-schedule-cost.test.d.ts.map +0 -1
  70. package/dist/pm/tpl-schedule-cost.test.js +0 -376
  71. package/dist/pm/tpl-schedule-cost.test.js.map +0 -1
@@ -1,414 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"tpl-quality-risk.test.js","sourceRoot":"","sources":["../../src/pm/tpl-quality-risk.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tpl-schedule-cost.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tpl-schedule-cost.test.d.ts","sourceRoot":"","sources":["../../src/pm/tpl-schedule-cost.test.ts"],"names":[],"mappings":""}