@xihe-lab/tapd-cli 2.0.0-rc.4 → 2.0.0-rc.6

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
package/LICENSE CHANGED
@@ -1,3 +1,4 @@
1
+
1
2
  Apache License
2
3
  Version 2.0, January 2004
3
4
  http://www.apache.org/licenses/
@@ -48,7 +49,7 @@
48
49
  "Contribution" shall mean any work of authorship, including
49
50
  the original version of the Work and any modifications or additions
50
51
  to that Work or Derivative Works thereof, that is intentionally
51
- submitted to the Licensor for inclusion in the Work by the copyright owner
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
53
  or by an individual or Legal Entity authorized to submit on behalf of
53
54
  the copyright owner. For the purposes of this definition, "submitted"
54
55
  means any form of electronic, verbal, or written communication sent
@@ -60,7 +61,7 @@
60
61
  designated in writing by the copyright owner as "Not a Contribution."
61
62
 
62
63
  "Contributor" shall mean Licensor and any individual or Legal Entity
63
- on behalf of whom a Contribution has been received by the Licensor and
64
+ on behalf of whom a Contribution has been received by Licensor and
64
65
  subsequently incorporated within the Work.
65
66
 
66
67
  2. Grant of Copyright License. Subject to the terms and conditions of
@@ -106,7 +107,7 @@
106
107
  (d) If the Work includes a "NOTICE" text file as part of its
107
108
  distribution, then any Derivative Works that You distribute must
108
109
  include a readable copy of the attribution notices contained
109
- within such NOTICE file, excluding any notices that do not
110
+ within such NOTICE file, excluding those notices that do not
110
111
  pertain to any part of the Derivative Works, in at least one
111
112
  of the following places: within a NOTICE text file distributed
112
113
  as part of the Derivative Works; within the Source form or
@@ -175,7 +176,18 @@
175
176
 
176
177
  END OF TERMS AND CONDITIONS
177
178
 
178
- Copyright 2025 xihe-lab
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [yyyy] [name of copyright owner]
179
191
 
180
192
  Licensed under the Apache License, Version 2.0 (the "License");
181
193
  you may not use this file except in compliance with the License.
package/README.md CHANGED
@@ -17,6 +17,18 @@ npm install -g @xihe-lab/tapd-cli
17
17
  - `tapd pipeline` — 管道执行(模板/表达式/校验/引擎/录制)
18
18
  - `tapd pm` — 研发项目管理操作(整合/范围/进度/成本/质量/资源/沟通/风险等场景)
19
19
 
20
+ ## 快速上手
21
+
22
+ ```bash
23
+ tapd --help # 命令总览
24
+ tapd auth status # 查看认证状态(首次使用先完成认证配置)
25
+ ```
26
+
27
+ ## 仓库与镜像
28
+
29
+ - GitHub(主):<https://github.com/xihe-lab/tapd-cli>
30
+ - Gitee 镜像:<https://gitee.com/xihe-lab/tapd-cli>
31
+
20
32
  ## License
21
33
 
22
- Apache-2.0
34
+ [Apache-2.0](./LICENSE)
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@xihe-lab/tapd-cli",
3
- "version": "2.0.0-rc.4",
3
+ "version": "2.0.0-rc.6",
4
4
  "description": "TAPD command line sharing the same kernel as tapd-mcp-server",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "tapd": "./dist/bin/tapd.js"
8
8
  },
9
9
  "scripts": {
10
- "build": "tsc",
10
+ "build": "tsc -p tsconfig.build.json",
11
11
  "type-check": "tsc --noEmit",
12
12
  "test": "tsx src/output/formatter.test.ts && tsx src/flags.test.ts && tsx src/pipeline/template.test.ts && tsx src/pipeline/expression.test.ts && tsx src/pipeline/validate.test.ts && tsx src/pipeline/engine.test.ts && tsx src/pipeline/record.test.ts && tsx src/pipeline/unwrap.test.ts && tsx src/pm/domains.test.ts && tsx src/pm/discovery.test.ts && tsx src/pm/iteration.test.ts && tsx src/pm/pm-command.test.ts && tsx src/pm/tpl-integration-scope.test.ts && tsx src/pm/tpl-schedule-cost.test.ts && tsx src/pm/tpl-quality-risk.test.ts && tsx src/pm/tpl-communication-stakeholder.test.ts && tsx src/advisor/domain-axis.test.ts"
13
13
  },
@@ -38,11 +38,14 @@
38
38
  "LICENSE"
39
39
  ],
40
40
  "dependencies": {
41
- "@xihe-lab/tapd-core": "2.0.0-rc.4",
41
+ "@xihe-lab/tapd-core": "2.0.0-rc.6",
42
42
  "commander": "^13.1.0",
43
43
  "yaml": "^2.9.0",
44
44
  "zod": "^3.25.76"
45
45
  },
46
46
  "homepage": "https://xihe-lab.com",
47
- "packageManager": "pnpm@12.3.4"
47
+ "packageManager": "pnpm@12.3.4",
48
+ "mirrors": {
49
+ "gitee": "git+https://gitee.com/xihe-lab/tapd-cli.git"
50
+ }
48
51
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=domain-axis.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domain-axis.test.d.ts","sourceRoot":"","sources":["../../src/advisor/domain-axis.test.ts"],"names":[],"mappings":""}
@@ -1,198 +0,0 @@
1
- // advisor 域轴 + 角色轴测试(S7,TAPD 需求 1139814312001001545)
2
- // fixture 模板写在测试临时目录(TAPD_USER_TEMPLATES_DIR 注入),不污染 templates/pm/;
3
- // 原子召回用真实 allTools registry(纯内存索引,不触 API)。
4
- import assert from 'node:assert/strict';
5
- import { mkdtempSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
6
- import { tmpdir } from 'node:os';
7
- import path from 'node:path';
8
- import { allTools, buildAdvisorIndex, recommend, ToolRegistry } from '@xihe-lab/tapd-core';
9
- import { buildProgram } from '../program.js';
10
- import { CliError } from '../errors.js';
11
- import { DOMAIN_KEYWORDS, domainsInText, matchQueryDomains } from './domain-axis.js';
12
- import { PERSONA_LABELS, parsePersona } from './persona.js';
13
- import { advise } from './recall.js';
14
- import { advisorJson, advisorNotes, renderAdvisorTable } from './render.js';
15
- import { PM_DOMAINS } from '../pm/index.js';
16
- // ---- fixture 模板(用户目录:当前 templates/pm/ 尚无域模板,S3-S6 并行开发中) ----
17
- const RISK_SCAN = `name: risk-scan
18
- domain: risk
19
- title: 多源风险扫描(fixture)
20
- write: false
21
- steps:
22
- - id: iterations
23
- uses: tapd_get_iterations
24
- args: { status: open }
25
- `;
26
- const RISK_REGISTER = `name: risk-register
27
- domain: risk
28
- title: 风险登记册维护(fixture 写场景)
29
- write: true
30
- steps:
31
- - id: stories
32
- uses: tapd_get_stories
33
- args: { fields: "id,name" }
34
- `;
35
- const QUALITY_DASHBOARD = `name: quality-dashboard
36
- domain: quality
37
- title: 质量度量盘(fixture)
38
- write: false
39
- steps:
40
- - id: bugs
41
- uses: tapd_get_bugs
42
- args: { fields: "id,status" }
43
- `;
44
- const root = mkdtempSync(path.join(tmpdir(), 'tapd-advisor-domain-'));
45
- mkdirSync(path.join(root, 'pm'), { recursive: true });
46
- writeFileSync(path.join(root, 'pm', 'risk-scan.yaml'), RISK_SCAN);
47
- writeFileSync(path.join(root, 'pm', 'risk-register.yaml'), RISK_REGISTER);
48
- writeFileSync(path.join(root, 'pm', 'quality-dashboard.yaml'), QUALITY_DASHBOARD);
49
- const prevEnv = process.env.TAPD_USER_TEMPLATES_DIR;
50
- process.env.TAPD_USER_TEMPLATES_DIR = root;
51
- const registry = new ToolRegistry();
52
- registry.register(allTools);
53
- const index = buildAdvisorIndex(registry);
54
- function commands(hits) {
55
- return hits.map(h => h.command);
56
- }
57
- const checks = [
58
- ['关键词表:八域齐备且与 PM_DOMAINS 同口径,每域中英文关键词都有', () => {
59
- assert.equal(DOMAIN_KEYWORDS.length, 8);
60
- assert.deepEqual(DOMAIN_KEYWORDS.map(e => e.domain), PM_DOMAINS.map(d => d.key), '域键顺序/集合必须与 pm 域表一致');
61
- for (const entry of DOMAIN_KEYWORDS) {
62
- assert.ok(entry.keywords.length >= 4, `${entry.domain} 关键词过少`);
63
- assert.ok(entry.keywords.some(k => /^[a-z0-9]+$/.test(k)), `${entry.domain} 缺英文关键词`);
64
- assert.ok(entry.keywords.some(k => !/^[a-z0-9]+$/.test(k)), `${entry.domain} 缺中文关键词`);
65
- assert.ok(entry.zh.length > 0);
66
- }
67
- }],
68
- ['域匹配:中文子串命中、英文词边界命中(cost 不吃 process)', () => {
69
- assert.deepEqual(matchQueryDomains('帮我扫一遍风险预警'), ['risk']);
70
- assert.deepEqual(domainsInText('范围基线冻结与需求冻结'), ['scope']);
71
- assert.deepEqual(domainsInText('use evm metrics to watch cost'), ['cost']);
72
- assert.ok(!domainsInText('this is a process review').includes('cost'), 'cost 不得子串误命中 process');
73
- assert.ok(domainsInText('工时预算超支了').includes('cost'));
74
- assert.deepEqual(matchQueryDomains('列表'), [], '无域关键词的查询不得误触发域轴');
75
- }],
76
- ['域命中 → pm 场景候选置顶,写标识随模板透传', () => {
77
- const result = advise('看看迭代的风险', index);
78
- assert.deepEqual(result.matchedDomains, ['risk']);
79
- assert.equal(result.hits[0].kind, 'pm');
80
- assert.equal(result.hits[0].command, 'pm risk register');
81
- assert.equal(result.hits[0].write, true, 'write:true 的 pm 场景必须保留写标识');
82
- assert.equal(result.hits[1].command, 'pm risk scan');
83
- assert.equal(result.hits[1].write, false);
84
- assert.equal(result.hits[2].kind, 'atomic', 'pm 场景之后才是原子命令候选');
85
- assert.ok(result.hits.every(h => h.kind !== 'pm' || h.domains.includes('risk')));
86
- // usage 提示随写场景附 --yes
87
- assert.equal(result.hits[0].usage, 'tapd pm risk register [--iteration <id>] [--dry-run] [--yes]');
88
- }],
89
- ['多域命中:按域表序排 pm 场景(quality 在 risk 前),原子块稳定跟随', () => {
90
- const result = advise('风险和用例分诊一起看', index);
91
- assert.deepEqual(result.matchedDomains, ['quality', 'risk']);
92
- // 集成后内置模板随域动态扩展(fixture + builtin 叠加),断言排序性质而非精确清单:
93
- // quality 与 risk 场景都出现,且所有 quality 场景先于所有 risk 场景,pm 块整体在原子块之前。
94
- const pm = commands(result.hits.filter(h => h.kind === 'pm'));
95
- const domOf = (c) => (c.startsWith('pm quality ') ? 'quality' : c.startsWith('pm risk ') ? 'risk' : 'other');
96
- const seq = pm.map(domOf);
97
- assert.ok(seq.includes('quality') && seq.includes('risk'), 'quality 与 risk 的 pm 场景都必须出现');
98
- const firstRisk = seq.indexOf('risk');
99
- assert.ok(seq.every((d, i) => d !== 'quality' || i < firstRisk), '域表序:quality 场景必须全部排在 risk 场景之前');
100
- const firstAtomic = result.hits.findIndex(h => h.kind === 'atomic');
101
- const lastPm = result.hits.map(h => h.kind === 'pm').lastIndexOf(true);
102
- assert.ok(firstAtomic < 0 || lastPm < firstAtomic, 'pm 场景块必须在原子块之前');
103
- }],
104
- ['未收录域:无模板自动跳过 pm 候选,退化为原子召回(给集成者的行为保证)', () => {
105
- // 八域现已全部收录内置模板,改用注入空目录直接验证降级语义(不再依赖「某域恰好无模板」)
106
- const result = advise('冻结范围基线', index, { limit: 10, catalog: { entries: [], warnings: [] } });
107
- assert.deepEqual(result.matchedDomains, ['scope']);
108
- assert.ok(result.hits.every(h => h.kind !== 'pm'), '目录为空时不得出现 pm 候选');
109
- assert.ok(result.hits.length > 0, '域命中但无模板时仍应返回原子候选');
110
- }],
111
- ['无 persona 且无域命中:与 core recommend 顺序逐位一致(现有行为零变化)', () => {
112
- const result = advise('列表', index);
113
- assert.deepEqual(result.matchedDomains, []);
114
- const baseline = recommend('列表', index, 10).map(h => h.command);
115
- assert.deepEqual(commands(result.hits), baseline);
116
- assert.ok(result.hits.every(h => h.kind === 'atomic'));
117
- assert.equal(result.persona, undefined);
118
- }],
119
- ['--persona 三档对同一查询顺序可区分:dev 偏 task/story,qa 偏 bug,pm 偏 pm 场景+iteration/release', () => {
120
- // limit 放大到 20:确保 dev/qa/pm 三方关心的代表命令都留在窗口内可比
121
- const base = advise('列表', index, { limit: 20 });
122
- const dev = advise('列表', index, { persona: 'dev', limit: 20 });
123
- const qa = advise('列表', index, { persona: 'qa', limit: 20 });
124
- const pm = advise('列表', index, { persona: 'pm', limit: 20 });
125
- const idx = (hits, cmd) => commands(hits).indexOf(cmd);
126
- const orderOf = (hits) => commands(hits).join(', ');
127
- assert.ok(idx(dev.hits, 'task list') < idx(dev.hits, 'bug list'), `dev: task list 应在 bug list 前: ${orderOf(dev.hits)}`);
128
- assert.ok(idx(dev.hits, 'story list') < idx(dev.hits, 'bug list'), `dev: story list 应在 bug list 前: ${orderOf(dev.hits)}`);
129
- assert.ok(idx(qa.hits, 'bug list') < idx(qa.hits, 'task list'), `qa: bug list 应在 task list 前: ${orderOf(qa.hits)}`);
130
- assert.ok(idx(qa.hits, 'bug list') < idx(qa.hits, 'story list'), `qa: bug list 应在 story list 前: ${orderOf(qa.hits)}`);
131
- assert.equal(pm.hits[0].kind, 'pm', 'pm persona 未命中域轴时也应注入 pm 场景候选');
132
- assert.ok(pm.hits.slice(0, 3).every(h => h.kind === 'pm'));
133
- const firstAtomic = pm.hits.find(h => h.kind === 'atomic').command;
134
- assert.match(firstAtomic, /^(iteration|release|report)\b/, `pm: 首个原子候选应为 iteration/release/report 类: ${firstAtomic}`);
135
- const orders = [commands(base.hits), commands(dev.hits), commands(qa.hits), commands(pm.hits)];
136
- for (let i = 0; i < orders.length; i++) {
137
- for (let j = i + 1; j < orders.length; j++) {
138
- assert.notDeepEqual(orders[i], orders[j], `第 ${i} 与 ${j} 档顺序必须可区分`);
139
- }
140
- }
141
- }],
142
- ['输出扩展:DOMAIN 列、说明行、JSON 扩展字段(tool/kind/domains/usage)', () => {
143
- const result = advise('看看迭代的风险', index, { persona: 'qa' });
144
- const table = renderAdvisorTable(result.hits);
145
- for (const fragment of ['COMMAND', 'WRITE', 'DOMAIN', 'DESCRIPTION', 'pm risk register', '✓']) {
146
- assert.ok(table.includes(fragment), `表格缺片段: ${fragment}`);
147
- }
148
- const notes = advisorNotes(result);
149
- assert.ok(notes.some(n => n.startsWith('domain: 命中知识域 risk')), `缺域命中说明: ${notes.join(' | ')}`);
150
- assert.ok(notes.some(n => n === `persona: qa —— ${PERSONA_LABELS.qa}`), `缺 persona 说明行: ${notes.join(' | ')}`);
151
- const parsed = JSON.parse(advisorJson(result.hits));
152
- const pmHit = parsed.find(h => h.kind === 'pm');
153
- assert.equal(pmHit.command, 'pm risk register');
154
- assert.equal(pmHit.write, true);
155
- assert.deepEqual(pmHit.domains, ['risk']);
156
- assert.equal(typeof pmHit.usage, 'string');
157
- assert.equal(pmHit.tool, undefined, 'pm 候选无底层工具名');
158
- const atomicHit = parsed.find(h => h.kind === 'atomic');
159
- assert.equal(typeof atomicHit.tool, 'string');
160
- assert.ok(Array.isArray(atomicHit.domains));
161
- }],
162
- ['未知 persona:parsePersona 报 INVALID_ARGS(exit 2),CLI 入口同样拒绝', async () => {
163
- assert.throws(() => parsePersona('boss'), (error) => error instanceof CliError && error.code === 'INVALID_ARGS' && error.exitCode === 2
164
- && error.message.includes('dev') && error.message.includes('qa') && error.message.includes('pm'));
165
- assert.equal(parsePersona(undefined), undefined);
166
- assert.equal(parsePersona('PM'), 'pm', '大小写不敏感');
167
- // 端到端:命令入口在发现模板/构建索引之前先校验 persona
168
- const program = buildProgram(registry, {});
169
- await assert.rejects(() => program.parseAsync(['node', 'tapd', 'advisor', '风险', '--persona', 'boss']), (error) => error instanceof CliError && error.code === 'INVALID_ARGS');
170
- }],
171
- ];
172
- let failed = 0;
173
- try {
174
- for (const [name, fn] of checks) {
175
- try {
176
- await fn();
177
- console.log(`ok - ${name}`);
178
- }
179
- catch (error) {
180
- failed++;
181
- console.error(`FAIL - ${name}`);
182
- console.error(error);
183
- }
184
- }
185
- }
186
- finally {
187
- if (prevEnv === undefined)
188
- delete process.env.TAPD_USER_TEMPLATES_DIR;
189
- else
190
- process.env.TAPD_USER_TEMPLATES_DIR = prevEnv;
191
- rmSync(root, { recursive: true, force: true });
192
- }
193
- if (failed > 0) {
194
- console.error(`\n${failed}/${checks.length} failed`);
195
- process.exit(1);
196
- }
197
- console.log(`\n${checks.length}/${checks.length} passed`);
198
- //# sourceMappingURL=domain-axis.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"domain-axis.test.js","sourceRoot":"","sources":["../../src/advisor/domain-axis.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=flags.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.test.d.ts","sourceRoot":"","sources":["../src/flags.test.ts"],"names":[],"mappings":""}
@@ -1,56 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { Command } from 'commander';
3
- import { allTools } from '@xihe-lab/tapd-core';
4
- import { bindSchemaFlags, toArgs } from './flags.js';
5
- const utility = allTools.find(t => t.name === 'tapd_short_to_long_id');
6
- function parseCommand(argv) {
7
- const sub = new Command('convert');
8
- bindSchemaFlags(sub, utility, utility.cli);
9
- sub.exitOverride();
10
- sub.parse(argv, { from: 'user' });
11
- return sub.opts();
12
- }
13
- const checks = [
14
- ['bindSchemaFlags: boolean 字段未传时为 undefined(交给 zod default)', () => {
15
- const opts = parseCommand([]);
16
- assert.equal(opts.isCloud, undefined);
17
- }],
18
- ['bindSchemaFlags: --is-cloud 置 true', () => {
19
- const opts = parseCommand(['--is-cloud']);
20
- assert.equal(opts.isCloud, true);
21
- }],
22
- ['bindSchemaFlags: --no-is-cloud 置 false', () => {
23
- const opts = parseCommand(['--no-is-cloud']);
24
- assert.equal(opts.isCloud, false);
25
- }],
26
- ['toArgs + schema parse: 未传 is_cloud 走 zod default true', () => {
27
- const opts = parseCommand([]);
28
- const args = toArgs(utility, utility.cli, opts, [], { workspaceId: 39814312 });
29
- const parsed = utility.inputSchema.parse({ short_id: '123', ...args });
30
- assert.equal(parsed.is_cloud, true);
31
- }],
32
- ['toArgs + schema parse: --no-is-cloud 传导为 false', () => {
33
- const opts = parseCommand(['--no-is-cloud']);
34
- const args = toArgs(utility, utility.cli, opts, [], { workspaceId: 39814312 });
35
- const parsed = utility.inputSchema.parse({ short_id: '123', ...args });
36
- assert.equal(parsed.is_cloud, false);
37
- }],
38
- ];
39
- let failed = 0;
40
- for (const [name, fn] of checks) {
41
- try {
42
- await fn();
43
- console.log(`ok - ${name}`);
44
- }
45
- catch (error) {
46
- failed++;
47
- console.error(`FAIL - ${name}`);
48
- console.error(error);
49
- }
50
- }
51
- if (failed > 0) {
52
- console.error(`\n${failed}/${checks.length} failed`);
53
- process.exit(1);
54
- }
55
- console.log(`\n${checks.length}/${checks.length} passed`);
56
- //# sourceMappingURL=flags.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"flags.test.js","sourceRoot":"","sources":["../src/flags.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAE,CAAC;AAExE,SAAS,YAAY,CAAC,IAAc;IAClC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IACnC,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,GAAG,CAAC,YAAY,EAAE,CAAC;IACnB,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,MAAM,GAA2C;IACrD,CAAC,2DAA2D,EAAE,GAAG,EAAE;YACjE,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC;IACF,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC;IACF,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAC9C,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACpC,CAAC,CAAC;IACF,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC7D,MAAM,IAAI,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAA4B,CAAC;YAClG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,CAAC,CAAC;IACF,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACtD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAA4B,CAAC;YAClG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC,CAAC;CACH,CAAC;AAEF,IAAI,MAAM,GAAG,CAAC,CAAC;AACf,KAAK,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,EAAE,EAAE,CAAC;QACX,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AACD,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AACD,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=formatter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.test.d.ts","sourceRoot":"","sources":["../../src/output/formatter.test.ts"],"names":[],"mappings":""}
@@ -1,170 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { format, unwrapEntity } from './formatter.js';
3
- import { renderTable, strWidth } from './table.js';
4
- const listCmd = {
5
- tool: 'tapd_get_stories',
6
- resource: 'story',
7
- action: 'list',
8
- write: false,
9
- hidden: false,
10
- };
11
- const detailCmd = {
12
- tool: 'tapd_get_story',
13
- resource: 'story',
14
- action: 'get',
15
- write: false,
16
- hidden: false,
17
- };
18
- const wrappedStories = [
19
- {
20
- Story: {
21
- id: '1135000000001',
22
- name: '登录页样式调整',
23
- priority_label: 'Medium',
24
- owner: 'zhangsan',
25
- status: 'inprogress',
26
- description: '调整登录页视觉细节',
27
- },
28
- },
29
- {
30
- Story: {
31
- id: '1135000000002',
32
- name: 'fix login redirect bug',
33
- priority_label: 'High',
34
- owner: 'lisi',
35
- status: 'closed',
36
- description: 'x',
37
- },
38
- },
39
- ];
40
- const detail = { Story: { id: '1135000000001', name: '登录页样式调整', owner: 'zhangsan', tags: ['p0', 'web'] } };
41
- const checks = [
42
- ['auto: 非 TTY 列表输出 json 且与 MCP content 同构(保留实体壳)', () => {
43
- const out = format({ ok: true, data: wrappedStories }, listCmd, { isTTY: false });
44
- assert.equal(out, JSON.stringify(wrappedStories, null, 2));
45
- assert.deepEqual(JSON.parse(out), wrappedStories);
46
- }],
47
- ['auto: 非 TTY 详情输出 json', () => {
48
- const out = format({ ok: true, data: detail }, detailCmd, { isTTY: false });
49
- assert.equal(out, JSON.stringify(detail, null, 2));
50
- }],
51
- ['auto: TTY 列表输出 table 且使用领域默认列', () => {
52
- const out = format({ ok: true, data: wrappedStories }, listCmd, { isTTY: true });
53
- const lines = out.split('\n');
54
- assert.equal(lines.length, 4);
55
- assert.match(lines[0], /^id {2,}name {2,}priority_label {2,}owner {2,}status/);
56
- assert.ok(!out.includes('description'), '领域列之外的字段不出现');
57
- assert.ok(lines[1].startsWith('---'));
58
- assert.ok(out.includes('登录页样式调整'));
59
- }],
60
- ['auto: TTY 详情输出 text 逐行 key: value', () => {
61
- const out = format({ ok: true, data: detail }, detailCmd, { isTTY: true });
62
- assert.ok(out.includes('id: 1135000000001'));
63
- assert.ok(out.includes('name: 登录页样式调整'));
64
- assert.ok(out.includes('tags:\n [\n "p0",\n "web"\n ]'));
65
- }],
66
- ['auto: TTY + meta.outputFormat 覆盖列表默认 table', () => {
67
- const out = format({ ok: true, data: wrappedStories }, listCmd, {
68
- isTTY: true,
69
- meta: { resource: 'story', action: 'list', outputFormat: 'text' },
70
- });
71
- assert.ok(out.includes('id: 1135000000001'));
72
- }],
73
- ['auto: configuredFormat 优先级高于 meta.outputFormat', () => {
74
- const out = format({ ok: true, data: wrappedStories }, listCmd, {
75
- isTTY: true,
76
- configuredFormat: 'json',
77
- meta: { resource: 'story', action: 'list', outputFormat: 'text' },
78
- });
79
- assert.deepEqual(JSON.parse(out), wrappedStories);
80
- }],
81
- ['--output 显式三值全覆盖', () => {
82
- const asText = format({ ok: true, data: wrappedStories }, listCmd, { isTTY: false, output: 'text' });
83
- assert.ok(asText.includes('id: 1135000000001'));
84
- assert.equal(asText.split('\n\n').length, 2);
85
- const asTable = format({ ok: true, data: wrappedStories }, listCmd, { isTTY: false, output: 'table' });
86
- assert.ok(asTable.split('\n')[1].startsWith('---'));
87
- const asJson = format({ ok: true, data: wrappedStories }, listCmd, { isTTY: true, output: 'json' });
88
- assert.deepEqual(JSON.parse(asJson), wrappedStories);
89
- }],
90
- ['unwrapEntity: [{Story:{...}}] 剥壳、[{count:x}] 不剥、单对象壳同样剥', () => {
91
- const list = unwrapEntity(wrappedStories);
92
- assert.equal(list.length, 2);
93
- assert.deepEqual(Object.keys(list[0]).sort(), ['description', 'id', 'name', 'owner', 'priority_label', 'status']);
94
- const counted = unwrapEntity([{ count: '5' }]);
95
- assert.deepEqual(counted, [{ count: '5' }]);
96
- const single = unwrapEntity(detail);
97
- assert.deepEqual(Object.keys(single), ['id', 'name', 'owner', 'tags']);
98
- }],
99
- ['领域列 fallback: story 五列;未知资源取全字段 key 前 6 列;meta.columns 优先', () => {
100
- const bugCmd = { ...listCmd, tool: 'tapd_get_bugs', resource: 'bug' };
101
- const bugTable = format({ ok: true, data: [{ Bug: { id: '1', title: 't', severity: '1', current_owner: 'a', status: 'new', extra: 'x' } }] }, bugCmd, { isTTY: true });
102
- assert.ok(bugTable.includes('current_owner'));
103
- const unknownCmd = { ...listCmd, resource: 'workspace' };
104
- const unknownTable = format({ ok: true, data: [{ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7 }] }, unknownCmd, { isTTY: true });
105
- const header = unknownTable.split('\n')[0];
106
- assert.ok(header.includes('f'));
107
- assert.ok(!header.includes(' g'), '仅前 6 列');
108
- const custom = format({ ok: true, data: wrappedStories }, listCmd, {
109
- isTTY: true,
110
- meta: { resource: 'story', action: 'list', columns: ['name', 'owner'] },
111
- });
112
- const customHeader = custom.split('\n')[0].trimEnd();
113
- assert.match(customHeader, /^name\s+owner$/);
114
- }],
115
- ['空结果三态: table/text 输出 (empty),json 输出 []', () => {
116
- assert.equal(format({ ok: true, data: [] }, listCmd, { isTTY: true, output: 'table' }), '(empty)');
117
- assert.equal(format({ ok: true, data: [] }, listCmd, { isTTY: true, output: 'text' }), '(empty)');
118
- assert.equal(format({ ok: true, data: [] }, listCmd, { isTTY: true, output: 'json' }), '[]');
119
- assert.equal(format({ ok: true }, detailCmd, { isTTY: false, output: 'json' }), '[]');
120
- assert.equal(format({ ok: true }, detailCmd, { isTTY: true, output: 'text' }), '(empty)');
121
- }],
122
- ['CJK 对齐: 混排数据各行显示宽度一致,CJK 按 2 列计宽', () => {
123
- const out = format({ ok: true, data: wrappedStories }, listCmd, { isTTY: true });
124
- const widths = out.split('\n').map(line => strWidth(line));
125
- assert.equal(strWidth('登'), 2);
126
- assert.equal(strWidth('a'), 1);
127
- assert.ok(new Set(widths).size === 1, `所有行显示宽度一致,实际: ${widths.join(',')}`);
128
- assert.equal(widths[0], widths[widths.length - 1]);
129
- }],
130
- ['超长单元格截断加省略号,verbose 输出完整内容', () => {
131
- const longName = '这是一个非常非常非常非常非常非常非常非常长的需求标题用来验证截断逻辑';
132
- const data = [{ Story: { id: '1', name: longName, owner: 'a', status: 's' } }];
133
- const out = format({ ok: true, data }, listCmd, { isTTY: true });
134
- assert.ok(out.includes('…'), '默认 40 列宽内截断');
135
- const full = format({ ok: true, data }, listCmd, { isTTY: true, verbose: true });
136
- assert.ok(!full.includes('…'));
137
- assert.ok(full.includes(longName));
138
- }],
139
- ['renderTable 直调: CJK 列对齐快照', () => {
140
- const out = renderTable([
141
- { id: '1', name: '需求A' },
142
- { id: '22', name: 'story-b' },
143
- ], ['id', 'name']);
144
- const lines = out.split('\n');
145
- assert.deepEqual(lines.map(l => l), [
146
- 'id name ',
147
- '-- -------',
148
- '1 需求A ',
149
- '22 story-b',
150
- ], 'CJK 名称按显示宽度 5 补齐,与 ascii 列对齐');
151
- }],
152
- ];
153
- let failed = 0;
154
- for (const [name, fn] of checks) {
155
- try {
156
- await fn();
157
- console.log(`ok - ${name}`);
158
- }
159
- catch (error) {
160
- failed++;
161
- console.error(`FAIL - ${name}`);
162
- console.error(error);
163
- }
164
- }
165
- if (failed > 0) {
166
- console.error(`\n${failed}/${checks.length} failed`);
167
- process.exit(1);
168
- }
169
- console.log(`\n${checks.length}/${checks.length} passed`);
170
- //# sourceMappingURL=formatter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatter.test.js","sourceRoot":"","sources":["../../src/output/formatter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=engine.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.test.d.ts","sourceRoot":"","sources":["../../src/pipeline/engine.test.ts"],"names":[],"mappings":""}