@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,392 @@
1
+ // S6 场景模板测试:communication-weekly / communication-notify / stakeholder-map
2
+ //
3
+ // 被测对象是随包发布的内置模板(packages/cli/templates/pm/*.yaml),经真实发现链路
4
+ // (discoverPmTemplates → loadPmTemplate)加载,registry 为 mock,不触真实 API:
5
+ // - weekly / map:只读场景,断言 report 口径(zzz/risk 过滤、比率保留分母、口径脚注、降级)
6
+ // - notify:写场景,断言写闸门(无 --yes 退出码 2)+ <p> 包裹 + entry_type 归一化 + where 跳过
7
+ // - 静态校验:loadPmTemplate(剥 domain)→ validateTemplate(参数 schema/引用/写标记)
8
+ import assert from 'node:assert/strict';
9
+ import { mkdtempSync, 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 { buildProgram } from '../program.js';
15
+ import { discoverPmTemplates, loadPmTemplate, resolvePmEntry } from './discovery.js';
16
+ import { validateTemplate } from '../pipeline/validate.js';
17
+ // ---- 时间助手(与模板 window 口径一致)----
18
+ const DAY = 86400000;
19
+ const isoDay = (offsetDays) => new Date(Date.now() + offsetDays * DAY).toISOString().slice(0, 10);
20
+ const TODAY = isoDay(0);
21
+ const YESTERDAY = isoDay(-1);
22
+ const TOMORROW = isoDay(1);
23
+ const at = (day, hm = '10:00:00') => `${day} ${hm}`;
24
+ // ---- mock 数据 ----
25
+ // 真实通道下 client.get 已解包 TAPD 信封,列表返回裸数组(tapd-client.ts unwrap)
26
+ const OPEN_ITERATIONS = [
27
+ { id: '3001', name: 'Sprint A', startdate: '2026-09-01', enddate: '2026-09-15', status: 'open' },
28
+ { id: '3003', name: 'zzz-delete-me 老迭代', startdate: '2026-12-31', status: 'open' },
29
+ { id: '3002', name: 'Sprint B', startdate: '2026-09-10', enddate: '2026-09-24', status: 'open' },
30
+ ];
31
+ const STORIES = [
32
+ { id: 's1', name: '登录重构', owner: 'alice', cc: 'dave', participator: 'alice;bob', status: 'done', priority_label: 'high', created: at(TODAY, '09:00'), completed: at(TODAY, '18:00'), label: '' },
33
+ { id: 's2', name: '导出优化', owner: 'bob;carol', cc: '', participator: '', status: 'developing', priority_label: 'mid', created: at('2026-01-01', '09:00'), completed: '', label: 'frontend' },
34
+ { id: 's3', name: '支付联调', owner: 'alice', cc: '', participator: '', status: 'new', priority_label: 'high', created: at(TODAY, '11:00'), completed: '', label: '' },
35
+ { id: 's9', name: 'zzz-delete-me 脏需求', owner: 'ghost', cc: '', participator: '', status: 'new', created: at(TODAY), completed: '', label: '' },
36
+ { id: 's10', name: '【风险】洪水预警', owner: 'risk-owner', cc: '', participator: '', status: 'new', created: at(TODAY), completed: '', label: 'risk' },
37
+ ];
38
+ const STORY_CHANGES = [
39
+ { story_id: 's1', created: at(TODAY, '12:00'), author: 'alice' },
40
+ { story_id: 's2', created: at(YESTERDAY, '12:00'), author: 'bob' },
41
+ { story_id: 's3', created: '2020-01-01 08:00:00', author: 'carol' },
42
+ ];
43
+ const BUGS = [
44
+ { id: 'b1', title: '登录崩溃', severity: '1', current_owner: 'bob', status: 'new', created: at(TODAY, '09:30'), closed: '' },
45
+ { id: 'b2', title: '文案错别字', severity: '3', current_owner: '', status: 'closed', created: '2026-08-01 09:00:00', closed: at(TODAY, '11:00') },
46
+ { id: 'b3', title: 'zzz-delete-me 脏缺陷', severity: '2', current_owner: 'ghost', status: 'new', created: at(TODAY), closed: '' },
47
+ ];
48
+ const TASKS = [
49
+ { id: 't1', name: '接口联调', owner: 'alice', status: 'progressing', progress: 50, due: at(TOMORROW, '18:00') },
50
+ { id: 't2', name: '回归测试', owner: 'bob', status: 'done', progress: 100, due: at(YESTERDAY, '18:00') },
51
+ { id: 't3', name: '周报整理', owner: 'carol', status: 'open', progress: 0, due: at(YESTERDAY, '18:00') },
52
+ { id: 't4', name: 'zzz-delete-me 脏任务', owner: 'ghost2', status: 'open', progress: 0, due: at(YESTERDAY, '18:00') },
53
+ ];
54
+ const TIMESHEET_ROWS = [
55
+ { owner: 'alice', spentdate: at(TODAY, '00:00'), timespent: '8', entity_type: 'story', entity_id: 's1' },
56
+ { owner: 'alice', spentdate: at(YESTERDAY, '00:00'), timespent: 6, entity_type: 'task', entity_id: 't1' },
57
+ { owner: 'bob', spentdate: at(TODAY, '00:00'), timespent: '4.5', entity_type: 'bug', entity_id: 'b1' },
58
+ { owner: 'ghost9', spentdate: '2020-01-01 00:00:00', timespent: '99', entity_type: 'story', entity_id: 's-old' },
59
+ ];
60
+ const USERS = [{ user: 'alice', role_id: '1' }, { user: 'bob', role_id: '1' }, { user: 'carol', role_id: '2' }, { user: 'dave', role_id: '2' }, { user: 'nobody', role_id: '3' }];
61
+ function optStr(schema) {
62
+ return z.object(schema).passthrough();
63
+ }
64
+ function makeRegistry() {
65
+ const tracker = {
66
+ probes: [], storiesArgs: [], changesArgs: [], bugsArgs: [],
67
+ tasksArgs: [], timesheetsArgs: [], usersArgs: [], commentArgs: [],
68
+ };
69
+ const str = z.string().optional();
70
+ const num = z.number().optional();
71
+ const tools = [
72
+ {
73
+ name: 'tapd_get_iterations',
74
+ description: 'mock: 迭代查询(缺省迭代探测数据源)',
75
+ inputSchema: optStr({ workspace_id: z.number().optional(), id: str, status: str, fields: str }),
76
+ handler: (_c, p) => {
77
+ tracker.probes.push(p);
78
+ return Promise.resolve(OPEN_ITERATIONS);
79
+ },
80
+ },
81
+ {
82
+ name: 'tapd_get_stories',
83
+ description: 'mock: 需求查询(含 zzz 脏数据与风险项)',
84
+ inputSchema: optStr({ workspace_id: z.number().optional(), iteration_id: str, fields: str, limit: num }),
85
+ handler: (_c, p) => {
86
+ tracker.storiesArgs.push(p);
87
+ return Promise.resolve(STORIES);
88
+ },
89
+ },
90
+ {
91
+ name: 'tapd_get_story_changes',
92
+ description: 'mock: 需求变更(含窗外旧数据)',
93
+ inputSchema: optStr({ workspace_id: z.number().optional(), limit: num, fields: str }),
94
+ handler: (_c, p) => {
95
+ tracker.changesArgs.push(p);
96
+ return Promise.resolve(STORY_CHANGES);
97
+ },
98
+ },
99
+ {
100
+ name: 'tapd_get_bugs',
101
+ description: 'mock: 缺陷查询(含 zzz 脏数据)',
102
+ inputSchema: optStr({ workspace_id: z.number().optional(), iteration_id: str, fields: str, limit: num }),
103
+ handler: (_c, p) => {
104
+ tracker.bugsArgs.push(p);
105
+ return Promise.resolve(BUGS);
106
+ },
107
+ },
108
+ {
109
+ name: 'tapd_get_tasks',
110
+ description: 'mock: 任务查询(含 zzz 脏数据与停滞任务)',
111
+ inputSchema: optStr({ workspace_id: z.number().optional(), iteration_id: str, fields: str, limit: num }),
112
+ handler: (_c, p) => {
113
+ tracker.tasksArgs.push(p);
114
+ return Promise.resolve(TASKS);
115
+ },
116
+ },
117
+ {
118
+ name: 'tapd_get_timesheets',
119
+ description: 'mock: 工时(按 spentdate >= 窗口过滤,模拟服务端时间查询)',
120
+ inputSchema: optStr({ workspace_id: z.number().optional(), spentdate: str, fields: str, limit: num }),
121
+ handler: (_c, p) => {
122
+ const args = p;
123
+ tracker.timesheetsArgs.push(args);
124
+ const m = /^>=\s*(\d{4}-\d{2}-\d{2})/.exec(String(args.spentdate ?? ''));
125
+ const since = m ? m[1] : '';
126
+ return Promise.resolve(TIMESHEET_ROWS.filter(r => !since || String(r.spentdate).slice(0, 10) >= since));
127
+ },
128
+ },
129
+ {
130
+ name: 'tapd_get_workspace_users',
131
+ description: 'mock: 成员名单(含零参与成员 nobody)',
132
+ inputSchema: optStr({ workspace_id: z.number().optional(), fields: str }),
133
+ handler: (_c, p) => {
134
+ tracker.usersArgs.push(p);
135
+ return Promise.resolve(USERS);
136
+ },
137
+ },
138
+ {
139
+ name: 'tapd_create_comment',
140
+ description: 'mock: 写评论',
141
+ write: true,
142
+ inputSchema: optStr({ workspace_id: z.number().optional(), entry_type: z.string(), entry_id: z.string(), description: z.string(), cc: str }),
143
+ handler: (_c, p) => {
144
+ tracker.commentArgs.push(p);
145
+ return Promise.resolve({ id: 'c-1', entry_id: p.entry_id });
146
+ },
147
+ },
148
+ ];
149
+ const registry = new ToolRegistry();
150
+ registry.register(tools);
151
+ return { registry, tracker };
152
+ }
153
+ function captureIo(run) {
154
+ const out = [];
155
+ const err = [];
156
+ const origOut = process.stdout.write.bind(process.stdout);
157
+ const origErr = process.stderr.write.bind(process.stderr);
158
+ process.stdout.write = (chunk) => {
159
+ out.push(String(chunk));
160
+ return true;
161
+ };
162
+ process.stderr.write = (chunk) => {
163
+ err.push(String(chunk));
164
+ return true;
165
+ };
166
+ return run().then(() => {
167
+ process.stdout.write = origOut;
168
+ process.stderr.write = origErr;
169
+ return { out: out.join(''), err: err.join('') };
170
+ }, error => {
171
+ process.stdout.write = origOut;
172
+ process.stderr.write = origErr;
173
+ throw error;
174
+ });
175
+ }
176
+ async function withExitCode(fn) {
177
+ const prev = process.exitCode;
178
+ try {
179
+ return await fn();
180
+ }
181
+ finally {
182
+ process.exitCode = prev;
183
+ }
184
+ }
185
+ async function runCli(registry, args) {
186
+ const program = buildProgram(registry, {});
187
+ return captureIo(async () => {
188
+ await program.parseAsync(['node', 'tapd', ...args]);
189
+ });
190
+ }
191
+ // ---- 环境隔离:用户模板目录指向空目录,凭证注入 mock 通道所需 ----
192
+ const emptyUserDir = mkdtempSync(path.join(tmpdir(), 'tapd-s6-tpl-'));
193
+ const prevEnv = process.env.TAPD_USER_TEMPLATES_DIR;
194
+ const prevToken = process.env.TAPD_ACCESS_TOKEN;
195
+ process.env.TAPD_USER_TEMPLATES_DIR = emptyUserDir;
196
+ process.env.TAPD_ACCESS_TOKEN = 's6-tpl-test-token';
197
+ const checks = [
198
+ ['发现:三个内置场景被收录,读写标记与 title 纪律齐备', () => {
199
+ const catalog = discoverPmTemplates();
200
+ assert.equal(catalog.warnings.length, 0, `发现不应有 warning: ${catalog.warnings.join('; ')}`);
201
+ const weekly = resolvePmEntry(catalog, 'communication', 'weekly');
202
+ const notify = resolvePmEntry(catalog, 'communication', 'notify');
203
+ const map = resolvePmEntry(catalog, 'stakeholder', 'map');
204
+ for (const e of [weekly, notify, map])
205
+ assert.equal(e.source, 'builtin', `${e.name} 应为内置模板`);
206
+ assert.equal(weekly.write, false);
207
+ assert.equal(notify.write, true);
208
+ assert.equal(map.write, false);
209
+ assert.ok(weekly.title.includes('数据稿') && weekly.title.includes('wiki 落库'), 'weekly title 注明数据稿与 wiki 落库');
210
+ assert.ok(notify.title.includes('人审') && notify.title.includes('--yes'), 'notify title 注明措辞人审 + --yes');
211
+ assert.ok(map.title.includes('403') && map.title.includes('降级'), 'map title 注明 403 权限与降级');
212
+ }],
213
+ ['静态校验:loadPmTemplate(剥 domain)→ validateTemplate 对 mock registry 全绿', () => {
214
+ const catalog = discoverPmTemplates();
215
+ const registry = makeRegistry().registry;
216
+ for (const [domain, scenario] of [['communication', 'weekly'], ['communication', 'notify'], ['stakeholder', 'map']]) {
217
+ const entry = resolvePmEntry(catalog, domain, scenario);
218
+ const { template, path } = loadPmTemplate(entry);
219
+ assert.ok(path.endsWith(`${domain}-${scenario}.yaml`), path);
220
+ assert.equal('domain' in template, false, 'pm 元数据字段应被剥离');
221
+ const result = validateTemplate(template, registry);
222
+ assert.deepEqual(result.errors, [], `${template.name} 校验错误: ${JSON.stringify(result.errors)}`);
223
+ assert.deepEqual(result.writeSteps, template.write ? ['comment'] : [], `${template.name} 写步骤清单`);
224
+ }
225
+ }],
226
+ ['weekly dry-run:计划预览含全部只读步骤与过滤声明,不执行业务步骤', async () => {
227
+ const { registry, tracker } = makeRegistry();
228
+ const io = await withExitCode(() => runCli(registry, ['pm', 'communication', 'weekly', '--dry-run', '--iteration', '3001']));
229
+ assert.ok(io.out.includes('dry-run'), io.out);
230
+ assert.ok(io.out.includes('"iteration_id": "3001"'), io.out);
231
+ for (const fragment of ['stories (tapd_get_stories)', 'story_changes (tapd_get_story_changes)', 'timesheets (tapd_get_timesheets)', 'weekly (expr)']) {
232
+ assert.ok(io.out.includes(fragment), `预览缺 ${fragment}`);
233
+ }
234
+ assert.ok(io.out.includes("zzz-delete-me"), '预览应展示 zzz 过滤声明');
235
+ assert.ok(!io.out.includes('[write]'), 'weekly 无写步骤');
236
+ assert.equal(tracker.storiesArgs.length, 0, 'dry-run 不执行业务步骤');
237
+ }],
238
+ ['weekly 真实执行:数据稿口径(zzz/风险剔除、比率保留分母、口径脚注、主观补充空章节)', async () => {
239
+ const { registry, tracker } = makeRegistry();
240
+ const io = await withExitCode(() => runCli(registry, ['pm', 'communication', 'weekly', '--iteration', '3001', '--workspace-id', '39814312']));
241
+ assert.equal(tracker.storiesArgs.length, 1, 'stories 恰执行一次');
242
+ assert.deepEqual(tracker.storiesArgs[0], {
243
+ iteration_id: '3001',
244
+ fields: 'id,name,owner,status,priority_label,created,completed,label',
245
+ limit: 200,
246
+ workspace_id: 39814312,
247
+ }, `stories 入参: ${JSON.stringify(tracker.storiesArgs[0])}`);
248
+ const report = io.out;
249
+ assert.ok(report.includes('# 迭代周报(数据稿)'), report);
250
+ assert.ok(report.includes('数据稿,人工补充后可选 wiki 落库'), report);
251
+ assert.ok(report.includes('迭代: Sprint A(2026-09-01 ~ 2026-09-15)'), `迭代元信息: ${report}`);
252
+ // zzz / 风险项剔除:脏数据与风险名称不得出现
253
+ assert.ok(!report.includes('zzz-delete-me 脏需求'), 'zzz 脏需求应被过滤');
254
+ assert.ok(!report.includes('【风险】洪水预警'), '风险项应被剔除');
255
+ // 需求口径:3 条有效,1 done → 完成度保留分母 1/3;新增 2(s1/s3 本窗创建)、关闭 1(s1 completed)
256
+ assert.ok(report.includes('完成度 1/3'), report);
257
+ assert.ok(report.includes('本周新增 2 / 本周关闭 1'), report);
258
+ assert.ok(report.includes('changes 近似核对: 2 条'), report);
259
+ // 缺陷口径:2 条有效,已关闭 1/2,本周新增 1 / 关闭 1
260
+ assert.ok(report.includes('已关闭 1/2'), report);
261
+ assert.ok(report.includes('本周新增 1 / 本周关闭 1'), report);
262
+ assert.ok(!report.includes('zzz-delete-me 脏缺陷'), 'zzz 脏缺陷应被过滤');
263
+ // 任务口径:3 条有效 1 完成,未启动 1,逾期 1,平均进度 50%
264
+ assert.ok(report.includes('完成 1/3'), report);
265
+ assert.ok(report.includes('未启动 1'), report);
266
+ assert.ok(report.includes('逾期未完成 1'), report);
267
+ assert.ok(report.includes('平均进度 50%'), report);
268
+ // 工时:窗口内 alice 8+6=14、bob 4.5(ghost9 的 2020 记录被服务端窗口过滤)
269
+ assert.ok(report.includes('合计 18.5 小时 / 2 人'), report);
270
+ assert.ok(report.includes('| alice | 14 | 2 |'), report);
271
+ // 固定脚注段 + 人工补充空章节
272
+ assert.ok(report.includes('## 口径脚注'), report);
273
+ for (const fragment of ['统计范围:', '过滤项:', '数据时间:', '完成度定义:']) {
274
+ assert.ok(report.includes(fragment), `口径脚注缺 ${fragment}`);
275
+ }
276
+ assert.ok(report.includes('## 主观补充'), report);
277
+ assert.equal(tracker.commentArgs.length, 0, 'weekly 不得触发写操作');
278
+ }],
279
+ ['weekly 缺省迭代:自动探测最新 open 迭代(zzz 老迭代不参与)并注入 vars', async () => {
280
+ const { registry, tracker } = makeRegistry();
281
+ const io = await withExitCode(() => runCli(registry, ['pm', 'communication', 'weekly']));
282
+ // probe 与模板自身的 iteration 步骤都打 tapd_get_iterations:按探测签名区分
283
+ const probeCalls = tracker.probes.filter(p => p.fields === 'id,name,startdate,status');
284
+ assert.equal(probeCalls.length, 1, '探测恰一次');
285
+ assert.equal(probeCalls[0].status, 'open');
286
+ assert.ok(io.err.includes('iteration: 自动选择 open 迭代 3002'), io.err);
287
+ assert.equal(tracker.storiesArgs[0].iteration_id, '3002');
288
+ }],
289
+ ['notify 写闸门:无 --yes 退出码 2、输出写预览、不触 API', async () => {
290
+ const { registry, tracker } = makeRegistry();
291
+ const io = await withExitCode(() => runCli(registry, ['pm', 'communication', 'notify', '--iteration', '3001', '--input', '{"entry_type":"stories","entry_id":"1140000001","message":"需求已延期一周","cc":"alice|bob"}']));
292
+ assert.ok(io.out.includes('write gate'), io.out);
293
+ assert.ok(io.out.includes('[write] comment (tapd_create_comment)'), io.out);
294
+ assert.ok(io.err.includes('WRITE_GATE'), io.err);
295
+ assert.equal(tracker.commentArgs.length, 0, '未 --yes 不得创建评论');
296
+ }],
297
+ ['notify --yes:纯文本包 <p>、entry_type 透传、cc 透传,回执含评论 ID', async () => {
298
+ const { registry, tracker } = makeRegistry();
299
+ const io = await withExitCode(() => runCli(registry, ['pm', 'communication', 'notify', '--yes', '--input', '{"entry_type":"stories","entry_id":"1140000001","message":"需求已延期一周,请大家知悉","cc":"alice|bob"}']));
300
+ assert.equal(tracker.commentArgs.length, 1);
301
+ const args = tracker.commentArgs[0];
302
+ assert.equal(args.entry_type, 'stories');
303
+ assert.equal(args.entry_id, '1140000001');
304
+ assert.equal(args.description, '<p>需求已延期一周,请大家知悉</p>', '纯文本必须包 <p>');
305
+ assert.equal(args.cc, 'alice|bob');
306
+ assert.ok(io.out.includes('# 变更通知回执'), io.out);
307
+ assert.ok(io.out.includes('c-1'), '回执应含评论 ID');
308
+ assert.ok(io.out.includes('已包 <p> 标签'), io.out);
309
+ }],
310
+ ['notify --yes:HTML 正文不二次包裹;entry_type 别名归一化(task→tasks)', async () => {
311
+ const { registry, tracker } = makeRegistry();
312
+ await withExitCode(() => runCli(registry, ['pm', 'communication', 'notify', '--yes', '--input', '{"entry_type":"task","entry_id":"1140000002","message":"<p>任务已上线</p>"}']));
313
+ assert.equal(tracker.commentArgs.length, 1);
314
+ const args = tracker.commentArgs[0];
315
+ assert.equal(args.description, '<p>任务已上线</p>', '已是 HTML 不得二次包裹');
316
+ assert.equal(args.entry_type, 'tasks', '单数别名应归一化为 tasks');
317
+ }],
318
+ ['notify --yes 但 message 为空:写步骤被 where 跳过,不触 API', async () => {
319
+ const { registry, tracker } = makeRegistry();
320
+ const io = await withExitCode(() => runCli(registry, ['pm', 'communication', 'notify', '--yes', '--output', 'json', '--input', '{"entry_type":"stories","entry_id":"1140000001","message":""}']));
321
+ assert.equal(tracker.commentArgs.length, 0, '空 message 不应创建评论');
322
+ const summary = JSON.parse(io.out);
323
+ assert.equal(summary.ok, true);
324
+ const comment = summary.steps.find(s => s.id === 'comment');
325
+ assert.equal(comment?.status, 'skipped');
326
+ assert.equal(comment?.skipReason, 'where');
327
+ }],
328
+ ['map 真实执行:人×参与对象数×角色视角矩阵、沉默干系人、零参与成员', async () => {
329
+ const { registry, tracker } = makeRegistry();
330
+ const io = await withExitCode(() => runCli(registry, ['pm', 'stakeholder', 'map', '--iteration', '3001']));
331
+ assert.equal(tracker.usersArgs.length, 1, 'users 接口恰调用一次');
332
+ assert.equal(tracker.storiesArgs.length, 1);
333
+ const report = io.out;
334
+ assert.ok(report.includes('# 干系人参与矩阵'), report);
335
+ assert.ok(report.includes('名单接口可用,共 5 人'), report);
336
+ assert.ok(!report.includes('ghost'), 'zzz 脏数据 owner 不得入矩阵');
337
+ // alice: 需求负责 2(s1/s3)+ 需求参与 1(s1 participator)+ 任务负责 1 = 4 个参与对象
338
+ assert.ok(report.includes('| alice | 2 | 0 | 1 | 1 | 0 | 4 |'), `alice 行口径: ${report}`);
339
+ // dave: 仅 s1 的 cc → 1 个参与对象
340
+ assert.ok(report.includes('| dave | 0 | 1 | 0 | 0 | 0 | 1 |'), `dave 行口径: ${report}`);
341
+ // carol: 需求负责 1(s2)+ 任务负责 1,且名下有停滞任务(progress=0 且 due 已过)→ 沉默标记
342
+ assert.ok(report.includes('是(周报整理)'), `carol 沉默标记: ${report}`);
343
+ assert.ok(report.includes('## 沉默干系人'), report);
344
+ assert.ok(report.includes('- carol(停滞任务: 周报整理)'), report);
345
+ // nobody 在册但未出现在任何参与字段 → 零参与成员
346
+ assert.ok(report.includes('## 零参与名单成员'), report);
347
+ assert.ok(report.includes('- nobody'), report);
348
+ assert.ok(!report.includes('- dave\n'), 'dave 已有 cc 参与,不应入零参与清单');
349
+ }],
350
+ ['map 降级:--input skip_users=true 时 users 不调用,矩阵从存量 owner 字段反推', async () => {
351
+ const { registry, tracker } = makeRegistry();
352
+ const io = await withExitCode(() => runCli(registry, ['pm', 'stakeholder', 'map', '--iteration', '3001', '--input', '{"skip_users":true}']));
353
+ assert.equal(tracker.usersArgs.length, 0, 'skip_users=true 不得调用 users 接口');
354
+ const report = io.out;
355
+ assert.ok(report.includes('降级模式'), report);
356
+ assert.ok(report.includes('仅从存量 owner/cc/participator 字段反推'), report);
357
+ assert.ok(!report.includes('nobody'), '降级模式无名单,不应出现零参与成员');
358
+ assert.ok(report.includes('| alice | 2 | 0 | 1 | 1 | 0 | 4 |'), '降级模式下矩阵仍由 owner/cc/participator 字段构成');
359
+ assert.ok(report.includes('是(周报整理)'), '沉默判定不依赖名单接口');
360
+ }],
361
+ ];
362
+ let failed = 0;
363
+ try {
364
+ for (const [name, fn] of checks) {
365
+ try {
366
+ await fn();
367
+ console.log(`ok - ${name}`);
368
+ }
369
+ catch (error) {
370
+ failed++;
371
+ console.error(`FAIL - ${name}`);
372
+ console.error(error);
373
+ }
374
+ }
375
+ }
376
+ finally {
377
+ if (prevEnv === undefined)
378
+ delete process.env.TAPD_USER_TEMPLATES_DIR;
379
+ else
380
+ process.env.TAPD_USER_TEMPLATES_DIR = prevEnv;
381
+ if (prevToken === undefined)
382
+ delete process.env.TAPD_ACCESS_TOKEN;
383
+ else
384
+ process.env.TAPD_ACCESS_TOKEN = prevToken;
385
+ rmSync(emptyUserDir, { recursive: true, force: true });
386
+ }
387
+ if (failed > 0) {
388
+ console.error(`\n${failed}/${checks.length} failed`);
389
+ process.exit(1);
390
+ }
391
+ console.log(`\n${checks.length}/${checks.length} passed`);
392
+ //# sourceMappingURL=tpl-communication-stakeholder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tpl-communication-stakeholder.test.js","sourceRoot":"","sources":["../../src/pm/tpl-communication-stakeholder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tpl-integration-scope.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tpl-integration-scope.test.d.ts","sourceRoot":"","sources":["../../src/pm/tpl-integration-scope.test.ts"],"names":[],"mappings":""}