@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.
- package/README.md +22 -0
- package/dist/advisor/domain-axis.d.ts +16 -0
- package/dist/advisor/domain-axis.d.ts.map +1 -0
- package/dist/advisor/domain-axis.js +43 -0
- package/dist/advisor/domain-axis.js.map +1 -0
- package/dist/advisor/domain-axis.test.d.ts +2 -0
- package/dist/advisor/domain-axis.test.d.ts.map +1 -0
- package/dist/advisor/domain-axis.test.js +198 -0
- package/dist/advisor/domain-axis.test.js.map +1 -0
- package/dist/advisor/index.d.ts +8 -0
- package/dist/advisor/index.d.ts.map +1 -0
- package/dist/advisor/index.js +6 -0
- package/dist/advisor/index.js.map +1 -0
- package/dist/advisor/persona.d.ts +12 -0
- package/dist/advisor/persona.d.ts.map +1 -0
- package/dist/advisor/persona.js +34 -0
- package/dist/advisor/persona.js.map +1 -0
- package/dist/advisor/recall.d.ts +38 -0
- package/dist/advisor/recall.d.ts.map +1 -0
- package/dist/advisor/recall.js +96 -0
- package/dist/advisor/recall.js.map +1 -0
- package/dist/advisor/render.d.ts +8 -0
- package/dist/advisor/render.d.ts.map +1 -0
- package/dist/advisor/render.js +42 -0
- package/dist/advisor/render.js.map +1 -0
- package/dist/commands/advisor.d.ts.map +1 -1
- package/dist/commands/advisor.js +31 -13
- package/dist/commands/advisor.js.map +1 -1
- package/dist/commands/pipeline.d.ts +4 -0
- package/dist/commands/pipeline.d.ts.map +1 -0
- package/dist/commands/pipeline.js +178 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/pm.d.ts +4 -0
- package/dist/commands/pm.d.ts.map +1 -0
- package/dist/commands/pm.js +175 -0
- package/dist/commands/pm.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/engine.d.ts +38 -0
- package/dist/pipeline/engine.d.ts.map +1 -0
- package/dist/pipeline/engine.js +326 -0
- package/dist/pipeline/engine.js.map +1 -0
- package/dist/pipeline/engine.test.d.ts +2 -0
- package/dist/pipeline/engine.test.d.ts.map +1 -0
- package/dist/pipeline/engine.test.js +419 -0
- package/dist/pipeline/engine.test.js.map +1 -0
- package/dist/pipeline/expression.d.ts +31 -0
- package/dist/pipeline/expression.d.ts.map +1 -0
- package/dist/pipeline/expression.js +249 -0
- package/dist/pipeline/expression.js.map +1 -0
- package/dist/pipeline/expression.test.d.ts +2 -0
- package/dist/pipeline/expression.test.d.ts.map +1 -0
- package/dist/pipeline/expression.test.js +111 -0
- package/dist/pipeline/expression.test.js.map +1 -0
- package/dist/pipeline/history.d.ts +13 -0
- package/dist/pipeline/history.d.ts.map +1 -0
- package/dist/pipeline/history.js +66 -0
- package/dist/pipeline/history.js.map +1 -0
- package/dist/pipeline/index.d.ts +13 -0
- package/dist/pipeline/index.d.ts.map +1 -0
- package/dist/pipeline/index.js +9 -0
- package/dist/pipeline/index.js.map +1 -0
- package/dist/pipeline/record.d.ts +13 -0
- package/dist/pipeline/record.d.ts.map +1 -0
- package/dist/pipeline/record.js +30 -0
- package/dist/pipeline/record.js.map +1 -0
- package/dist/pipeline/record.test.d.ts +2 -0
- package/dist/pipeline/record.test.d.ts.map +1 -0
- package/dist/pipeline/record.test.js +109 -0
- package/dist/pipeline/record.test.js.map +1 -0
- package/dist/pipeline/template.d.ts +24 -0
- package/dist/pipeline/template.d.ts.map +1 -0
- package/dist/pipeline/template.js +134 -0
- package/dist/pipeline/template.js.map +1 -0
- package/dist/pipeline/template.test.d.ts +2 -0
- package/dist/pipeline/template.test.d.ts.map +1 -0
- package/dist/pipeline/template.test.js +94 -0
- package/dist/pipeline/template.test.js.map +1 -0
- package/dist/pipeline/types.d.ts +99 -0
- package/dist/pipeline/types.d.ts.map +1 -0
- package/dist/pipeline/types.js +31 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/pipeline/unwrap.d.ts +3 -0
- package/dist/pipeline/unwrap.d.ts.map +1 -0
- package/dist/pipeline/unwrap.js +26 -0
- package/dist/pipeline/unwrap.js.map +1 -0
- package/dist/pipeline/unwrap.test.d.ts +2 -0
- package/dist/pipeline/unwrap.test.d.ts.map +1 -0
- package/dist/pipeline/unwrap.test.js +36 -0
- package/dist/pipeline/unwrap.test.js.map +1 -0
- package/dist/pipeline/validate.d.ts +18 -0
- package/dist/pipeline/validate.d.ts.map +1 -0
- package/dist/pipeline/validate.js +134 -0
- package/dist/pipeline/validate.js.map +1 -0
- package/dist/pipeline/validate.test.d.ts +2 -0
- package/dist/pipeline/validate.test.d.ts.map +1 -0
- package/dist/pipeline/validate.test.js +166 -0
- package/dist/pipeline/validate.test.js.map +1 -0
- package/dist/pm/discovery.d.ts +54 -0
- package/dist/pm/discovery.d.ts.map +1 -0
- package/dist/pm/discovery.js +198 -0
- package/dist/pm/discovery.js.map +1 -0
- package/dist/pm/discovery.test.d.ts +2 -0
- package/dist/pm/discovery.test.d.ts.map +1 -0
- package/dist/pm/discovery.test.js +147 -0
- package/dist/pm/discovery.test.js.map +1 -0
- package/dist/pm/domains.d.ts +15 -0
- package/dist/pm/domains.d.ts.map +1 -0
- package/dist/pm/domains.js +27 -0
- package/dist/pm/domains.js.map +1 -0
- package/dist/pm/domains.test.d.ts +2 -0
- package/dist/pm/domains.test.d.ts.map +1 -0
- package/dist/pm/domains.test.js +141 -0
- package/dist/pm/domains.test.js.map +1 -0
- package/dist/pm/index.d.ts +9 -0
- package/dist/pm/index.d.ts.map +1 -0
- package/dist/pm/index.js +6 -0
- package/dist/pm/index.js.map +1 -0
- package/dist/pm/iteration.d.ts +26 -0
- package/dist/pm/iteration.d.ts.map +1 -0
- package/dist/pm/iteration.js +50 -0
- package/dist/pm/iteration.js.map +1 -0
- package/dist/pm/iteration.test.d.ts +2 -0
- package/dist/pm/iteration.test.d.ts.map +1 -0
- package/dist/pm/iteration.test.js +125 -0
- package/dist/pm/iteration.test.js.map +1 -0
- package/dist/pm/pm-command.test.d.ts +2 -0
- package/dist/pm/pm-command.test.d.ts.map +1 -0
- package/dist/pm/pm-command.test.js +321 -0
- package/dist/pm/pm-command.test.js.map +1 -0
- package/dist/pm/render.d.ts +17 -0
- package/dist/pm/render.d.ts.map +1 -0
- package/dist/pm/render.js +82 -0
- package/dist/pm/render.js.map +1 -0
- package/dist/pm/tpl-communication-stakeholder.test.d.ts +2 -0
- package/dist/pm/tpl-communication-stakeholder.test.d.ts.map +1 -0
- package/dist/pm/tpl-communication-stakeholder.test.js +392 -0
- package/dist/pm/tpl-communication-stakeholder.test.js.map +1 -0
- package/dist/pm/tpl-integration-scope.test.d.ts +2 -0
- package/dist/pm/tpl-integration-scope.test.d.ts.map +1 -0
- package/dist/pm/tpl-integration-scope.test.js +387 -0
- package/dist/pm/tpl-integration-scope.test.js.map +1 -0
- package/dist/pm/tpl-quality-risk.test.d.ts +2 -0
- package/dist/pm/tpl-quality-risk.test.d.ts.map +1 -0
- package/dist/pm/tpl-quality-risk.test.js +414 -0
- package/dist/pm/tpl-quality-risk.test.js.map +1 -0
- package/dist/pm/tpl-schedule-cost.test.d.ts +2 -0
- package/dist/pm/tpl-schedule-cost.test.d.ts.map +1 -0
- package/dist/pm/tpl-schedule-cost.test.js +376 -0
- package/dist/pm/tpl-schedule-cost.test.js.map +1 -0
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +6 -0
- package/dist/program.js.map +1 -1
- package/package.json +11 -6
- package/templates/deliver-story.yaml +38 -0
- package/templates/iteration-review.yaml +52 -0
- package/templates/pm/README.md +57 -0
- package/templates/pm/communication-notify.yaml +65 -0
- package/templates/pm/communication-weekly.yaml +160 -0
- package/templates/pm/cost-report.yaml +74 -0
- package/templates/pm/integration-close.yaml +118 -0
- package/templates/pm/integration-health.yaml +155 -0
- package/templates/pm/integration-kickoff.yaml +94 -0
- package/templates/pm/quality-dashboard.yaml +88 -0
- package/templates/pm/quality-triage.yaml +42 -0
- package/templates/pm/risk-register.yaml +55 -0
- package/templates/pm/risk-scan.yaml +87 -0
- package/templates/pm/schedule-burndown.yaml +87 -0
- package/templates/pm/schedule-standup.yaml +109 -0
- package/templates/pm/scope-baseline.yaml +93 -0
- package/templates/pm/scope-drift-check.yaml +129 -0
- package/templates/pm/stakeholder-map.yaml +121 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"tpl-schedule-cost.test.d.ts","sourceRoot":"","sources":["../../src/pm/tpl-schedule-cost.test.ts"],"names":[],"mappings":""}
|