zephyr-enterprise-tools 1.2.8 → 1.3.1
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 +32 -1
- package/cli.js +99 -0
- package/mcp-server.js +84 -0
- package/package.json +1 -1
- package/zephyr-enterprise-tools.d.ts +154 -0
- package/zephyr-enterprise-tools.js +601 -48
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ Comprehensive tools for Zephyr Enterprise — Release Readiness, Project Health,
|
|
|
11
11
|
| Tool | Description | Thresholds |
|
|
12
12
|
|------|-------------|------------|
|
|
13
13
|
| `release-readiness` | Run all 4 quality gates | Combined assessment |
|
|
14
|
+
| `compare-releases` | Compare readiness across two releases | MCP/programmatic API |
|
|
14
15
|
| `requirement-coverage` | Are requirements covered by tests? | ≥70% = GO |
|
|
15
16
|
| `test-plan` | Are tests planned and assigned? | <80% = NO GO, 80–90% = CONDITIONAL, ≥90% = GO |
|
|
16
17
|
| `test-execution` | Have tests been executed? | <90% = NO GO, 90–97% = CONDITIONAL, ≥97% = GO |
|
|
@@ -28,7 +29,10 @@ Comprehensive tools for Zephyr Enterprise — Release Readiness, Project Health,
|
|
|
28
29
|
| `search-tests` | Search test cases by keyword query |
|
|
29
30
|
| `user-activity` | User activity and productivity metrics |
|
|
30
31
|
| `user-trend` | Full audit log history for a user — every action across the system, filterable by date range, entity type, and operation |
|
|
32
|
+
| `execution-burnup` | Day-by-day execution burnup (cumulative executed vs ideal and total scope), supports optional date range filtering |
|
|
31
33
|
| `execution-burndown` | Day-by-day execution burndown (remaining vs ideal), supports optional date range filtering |
|
|
34
|
+
| `list-cycles` | List all test cycles for a release, including phases and execution status counts |
|
|
35
|
+
| `get-cycle` | Get full details for a single test cycle |
|
|
32
36
|
|
|
33
37
|
---
|
|
34
38
|
|
|
@@ -66,6 +70,7 @@ Use `zephyr-enterprise-tools` as an MCP (Model Context Protocol) server with you
|
|
|
66
70
|
| `list_projects` | _(none)_ | List all Zephyr projects |
|
|
67
71
|
| `list_releases` | `projectId` | List releases for a project |
|
|
68
72
|
| `release_readiness` | `projectId`, `releaseId` | Run all 4 quality gates |
|
|
73
|
+
| `compare_releases` | `projectId`, `releaseId1`, `releaseId2`, `query?` _(ZQL)_ | Compare readiness between two releases in the same project |
|
|
69
74
|
| `requirement_coverage` | `projectId`, `releaseId` | Check requirement coverage |
|
|
70
75
|
| `test_plan_analysis` | `projectId`, `releaseId`, `query?` _(ZQL)_ | Analyze test planning status — supports ZQL filter e.g. `priority = "P1"` |
|
|
71
76
|
| `test_execution` | `projectId`, `releaseId` | Check test execution progress |
|
|
@@ -77,13 +82,18 @@ Use `zephyr-enterprise-tools` as an MCP (Model Context Protocol) server with you
|
|
|
77
82
|
| `search_test_cases` | `projectId`, `releaseId`, `query?`, `limit?` | Search test cases by keyword |
|
|
78
83
|
| `user_activity` | `projectId`, `releaseId`, `days?` | Get user activity metrics |
|
|
79
84
|
| `user_trend` | `userName`*, `fromDate?`, `toDate?`, `entity?`, `operation?`, `pageSize?`, `offset?` | Full audit log history for a user |
|
|
85
|
+
| `execution_burnup` | `projectId`, `releaseId`, `startDate?`, `endDate?` | Day-by-day burnup chart data with cumulative executed, ideal, and scope counts |
|
|
80
86
|
| `execution_burndown` | `projectId`, `releaseId`, `startDate?`, `endDate?` | Day-by-day burndown chart data |
|
|
87
|
+
| `list_cycles` | `releaseId` | List all test cycles for a release, including phases and execution status counts |
|
|
88
|
+
| `get_cycle` | `cycleId` | Get full details for a single test cycle, including phases |
|
|
81
89
|
|
|
82
90
|
> **\* `user_trend` — `userName` must be the user's full email address** (e.g. `jane.doe@yourcompany.com`). Short names or display names will return 0 results. `pageSize` supports up to 1000 records per request.
|
|
83
91
|
|
|
84
92
|
> **`test_plan_analysis` ZQL filter** — Use the `query` parameter to scope results to a specific priority, e.g. `priority = "P1"`. This is the recommended way to filter test plan metrics by priority. Note: `search_test_cases` accepts keyword queries but does not support ZQL priority filtering.
|
|
85
93
|
|
|
86
|
-
>
|
|
94
|
+
> **Execution chart date range** — Use `startDate` and `endDate` (format: `YYYY-MM-DD`) to scope `execution_burnup` and `execution_burndown` to a specific period within the release window.
|
|
95
|
+
|
|
96
|
+
> **Execution status IDs** — Test execution, failed tests, trends, user activity, burnup, burndown, and cycle status counts resolve status IDs from Zephyr v4 system preferences using `testresult.testresultStatus.LOV` from `/admin/preference/all/system`. Built-in IDs are used only as a fallback when the preference cannot be loaded or parsed.
|
|
87
97
|
|
|
88
98
|
---
|
|
89
99
|
|
|
@@ -179,6 +189,15 @@ zephyr-enterprise-tools -p 364 -r 4312 -t test-plan -q 'priority = "P1"'
|
|
|
179
189
|
# Get trends for last 14 days
|
|
180
190
|
zephyr-enterprise-tools -p 364 -r 4312 -t test-trends -d 14
|
|
181
191
|
|
|
192
|
+
# Get execution burnup chart data
|
|
193
|
+
zephyr-enterprise-tools -p 364 -r 4312 -t execution-burnup --start-date 2026-07-22 --end-date 2026-08-27
|
|
194
|
+
|
|
195
|
+
# List all cycles and phase details for a release
|
|
196
|
+
zephyr-enterprise-tools -p 364 -r 4312 -t list-cycles
|
|
197
|
+
|
|
198
|
+
# Get one cycle by ID
|
|
199
|
+
zephyr-enterprise-tools -p 364 -r 4312 -t get-cycle -c 98765
|
|
200
|
+
|
|
182
201
|
# Get user audit log (full email required)
|
|
183
202
|
zephyr-enterprise-tools -t user-trend --user jane.doe@yourcompany.com --page-size 1000
|
|
184
203
|
|
|
@@ -199,6 +218,7 @@ zephyr-enterprise-tools --help
|
|
|
199
218
|
| `-q, --query <text>` | Keyword query (for `search-tests`) or ZQL expression (for `test-plan`) |
|
|
200
219
|
| `-d, --days <n>` | Days for trends/activity (default: 30) |
|
|
201
220
|
| `-l, --limit <n>` | Max results (default: 50) |
|
|
221
|
+
| `-c, --cycle <id>` | Cycle ID for `get-cycle` |
|
|
202
222
|
| `--user <email>` | Full email address for `user-trend` |
|
|
203
223
|
| `--page-size <n>` | Records per page for `user-trend` (max: 1000) |
|
|
204
224
|
| `--start-date <YYYY-MM-DD>` | Start date for `execution-burndown` |
|
|
@@ -230,6 +250,9 @@ const tools = new ZephyrEnterpriseTools({
|
|
|
230
250
|
const report = await tools.runAllGates(364, 4312);
|
|
231
251
|
console.log(report.overallStatus); // "GO" | "CONDITIONAL GO" | "NO GO"
|
|
232
252
|
|
|
253
|
+
const comparison = await tools.compareReleases(364, 4312, 4313, { query: 'priority = "P1"' });
|
|
254
|
+
console.log(comparison.overallStatusChanged); // true when release readiness status changed
|
|
255
|
+
|
|
233
256
|
// Individual gates
|
|
234
257
|
const coverage = await tools.requirementCoverageGate(364, 4312);
|
|
235
258
|
const planning = await tools.testPlanAnalysisGate(364, 4312);
|
|
@@ -247,6 +270,14 @@ const reqCoverage = await tools.getRequirementCoverage(364, 4312);
|
|
|
247
270
|
const trends = await tools.getTestCaseTrends(364, 4312, { days: 14 });
|
|
248
271
|
const results = await tools.searchTestCases(364, 4312, { query: 'login' });
|
|
249
272
|
const activity = await tools.getUserActivity(364, 4312, { days: 30 });
|
|
273
|
+
const cycles = await tools.listCycles(4312);
|
|
274
|
+
const cycle = await tools.getCycle(98765);
|
|
275
|
+
|
|
276
|
+
// Burnup with optional date range
|
|
277
|
+
const burnup = await tools.getExecutionBurnup(364, 4312, {
|
|
278
|
+
startDate: '2026-07-22',
|
|
279
|
+
endDate: '2026-08-27',
|
|
280
|
+
});
|
|
250
281
|
|
|
251
282
|
// User audit log — full email address required; pageSize up to 1000
|
|
252
283
|
const auditLog = await tools.getUserTrend({
|
package/cli.js
CHANGED
|
@@ -42,6 +42,9 @@ function parseArgs() {
|
|
|
42
42
|
query: '',
|
|
43
43
|
days: 30,
|
|
44
44
|
limit: 50,
|
|
45
|
+
cycleId: null,
|
|
46
|
+
startDate: null,
|
|
47
|
+
endDate: null,
|
|
45
48
|
};
|
|
46
49
|
|
|
47
50
|
for (let i = 0; i < args.length; i++) {
|
|
@@ -76,6 +79,16 @@ function parseArgs() {
|
|
|
76
79
|
case '--limit':
|
|
77
80
|
options.limit = parseInt(args[++i], 10) || 50;
|
|
78
81
|
break;
|
|
82
|
+
case '-c':
|
|
83
|
+
case '--cycle':
|
|
84
|
+
options.cycleId = Number(args[++i]);
|
|
85
|
+
break;
|
|
86
|
+
case '--start-date':
|
|
87
|
+
options.startDate = args[++i] || null;
|
|
88
|
+
break;
|
|
89
|
+
case '--end-date':
|
|
90
|
+
options.endDate = args[++i] || null;
|
|
91
|
+
break;
|
|
79
92
|
case '--json':
|
|
80
93
|
options.format = 'json';
|
|
81
94
|
break;
|
|
@@ -117,6 +130,7 @@ OPTIONS:
|
|
|
117
130
|
-q, --query <text> Search query (for search-tests)
|
|
118
131
|
-d, --days <n> Number of days for trends/activity (default: 30)
|
|
119
132
|
-l, --limit <n> Max results to return (default: 50)
|
|
133
|
+
-c, --cycle <id> Cycle ID (for get-cycle)
|
|
120
134
|
--json Output as JSON
|
|
121
135
|
--table Output as table (default)
|
|
122
136
|
-h, --help Show this help
|
|
@@ -140,6 +154,10 @@ AVAILABLE TOOLS:
|
|
|
140
154
|
│ test-trends Test execution trends over time │
|
|
141
155
|
│ search-tests Search test cases by query │
|
|
142
156
|
│ user-activity User activity and productivity metrics │
|
|
157
|
+
│ execution-burnup Day-by-day execution burnup chart │
|
|
158
|
+
│ execution-burndown Day-by-day execution burndown chart │
|
|
159
|
+
│ list-cycles List all cycles for a release with phase details │
|
|
160
|
+
│ get-cycle Get full details for one cycle (-c <cycleId>) │
|
|
143
161
|
└─────────────────────────────────────────────────────────────────────────────┘
|
|
144
162
|
|
|
145
163
|
ENVIRONMENT VARIABLES:
|
|
@@ -165,6 +183,15 @@ EXAMPLES:
|
|
|
165
183
|
# Get user activity report
|
|
166
184
|
zephyr-tools -p 364 -r 4312 -t user-activity
|
|
167
185
|
|
|
186
|
+
# Get execution burnup chart data
|
|
187
|
+
zephyr-tools -p 364 -r 4312 -t execution-burnup --start-date 2026-07-22 --end-date 2026-08-27
|
|
188
|
+
|
|
189
|
+
# List all cycles and phase details for a release
|
|
190
|
+
zephyr-tools -p 364 -r 4312 -t list-cycles
|
|
191
|
+
|
|
192
|
+
# Get a single cycle detail
|
|
193
|
+
zephyr-tools -p 364 -r 4312 -t get-cycle -c 98765
|
|
194
|
+
|
|
168
195
|
QUALITY GATE THRESHOLDS:
|
|
169
196
|
Requirement Coverage: ≥70% = GO
|
|
170
197
|
Test Plan Analysis: <80% = NO GO, 80-90% = CONDITIONAL, ≥90% = GO
|
|
@@ -412,6 +439,27 @@ function formatGenericResult(result) {
|
|
|
412
439
|
}
|
|
413
440
|
console.log(' └────────────┴───────┴────────┴────────┴─────────┘');
|
|
414
441
|
}
|
|
442
|
+
|
|
443
|
+
if (result.dailyBurnup && result.dailyBurnup.length > 0) {
|
|
444
|
+
console.log('\n📈 DAILY BURNUP (last 10 days):');
|
|
445
|
+
console.log(' ┌────────────┬────────┬────────────┬───────┬───────┐');
|
|
446
|
+
console.log(' │ Date │ Today │ Cumulative │ Ideal │ Scope │');
|
|
447
|
+
console.log(' ├────────────┼────────┼────────────┼───────┼───────┤');
|
|
448
|
+
for (const day of result.dailyBurnup.slice(-10)) {
|
|
449
|
+
console.log(` │ ${day.date} │ ${String(day.executedToday).padEnd(6)} │ ${String(day.cumulativeExecuted).padEnd(10)} │ ${String(day.ideal).padEnd(5)} │ ${String(day.scope).padEnd(5)} │`);
|
|
450
|
+
}
|
|
451
|
+
console.log(' └────────────┴────────┴────────────┴───────┴───────┘');
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
// Cycles list/detail
|
|
455
|
+
if (result.cycles && result.cycles.length > 0) {
|
|
456
|
+
console.log(`\n🔁 CYCLES (${result.total || result.cycles.length}):`);
|
|
457
|
+
for (const cycle of result.cycles) {
|
|
458
|
+
printCycleDetail(cycle);
|
|
459
|
+
}
|
|
460
|
+
} else if (result.tool === 'Get Cycle' || result.cycleId) {
|
|
461
|
+
printCycleDetail(result);
|
|
462
|
+
}
|
|
415
463
|
|
|
416
464
|
// Recommendations
|
|
417
465
|
if (result.recommendations) {
|
|
@@ -449,6 +497,35 @@ function formatKey(key) {
|
|
|
449
497
|
.trim();
|
|
450
498
|
}
|
|
451
499
|
|
|
500
|
+
function printCycleDetail(cycle) {
|
|
501
|
+
console.log(` • ${cycle.name || 'Unnamed Cycle'} [ID: ${cycle.id || cycle.cycleId}]`);
|
|
502
|
+
if (cycle.environment || cycle.build || cycle.status) {
|
|
503
|
+
console.log(` Environment: ${cycle.environment || 'N/A'} | Build: ${cycle.build || 'N/A'} | Status: ${cycle.status || 'N/A'}`);
|
|
504
|
+
}
|
|
505
|
+
if (cycle.startDate || cycle.endDate) {
|
|
506
|
+
console.log(` Dates: ${cycle.startDate || 'N/A'} → ${cycle.endDate || 'N/A'}`);
|
|
507
|
+
}
|
|
508
|
+
if (cycle.executionStatusCounts?.breakdown?.length) {
|
|
509
|
+
const breakdown = cycle.executionStatusCounts.breakdown
|
|
510
|
+
.map(item => `${item.label}: ${item.count}`)
|
|
511
|
+
.join(', ');
|
|
512
|
+
console.log(` Execution Status: total ${cycle.executionStatusCounts.total}; ${breakdown}`);
|
|
513
|
+
}
|
|
514
|
+
if (cycle.phases?.length) {
|
|
515
|
+
console.log(` Phases (${cycle.phases.length}):`);
|
|
516
|
+
for (const phase of cycle.phases) {
|
|
517
|
+
const dates = phase.startDate || phase.endDate ? ` (${phase.startDate || 'N/A'} → ${phase.endDate || 'N/A'})` : '';
|
|
518
|
+
console.log(` - ${phase.name || 'Unnamed Phase'} [ID: ${phase.id}]${dates}`);
|
|
519
|
+
if (phase.executionStatusCounts?.breakdown?.length) {
|
|
520
|
+
const breakdown = phase.executionStatusCounts.breakdown
|
|
521
|
+
.map(item => `${item.label}: ${item.count}`)
|
|
522
|
+
.join(', ');
|
|
523
|
+
console.log(` Execution Status: total ${phase.executionStatusCounts.total}; ${breakdown}`);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
452
529
|
// ─── Main ─────────────────────────────────────────────────────────────────────
|
|
453
530
|
|
|
454
531
|
async function main() {
|
|
@@ -515,6 +592,28 @@ async function main() {
|
|
|
515
592
|
case 'user-activity':
|
|
516
593
|
result = await tools.getUserActivity(projectId, releaseId, { days });
|
|
517
594
|
break;
|
|
595
|
+
case 'execution-burnup':
|
|
596
|
+
result = await tools.getExecutionBurnup(projectId, releaseId, {
|
|
597
|
+
startDate: options.startDate,
|
|
598
|
+
endDate: options.endDate,
|
|
599
|
+
});
|
|
600
|
+
break;
|
|
601
|
+
case 'execution-burndown':
|
|
602
|
+
result = await tools.getExecutionBurndown(projectId, releaseId, {
|
|
603
|
+
startDate: options.startDate,
|
|
604
|
+
endDate: options.endDate,
|
|
605
|
+
});
|
|
606
|
+
break;
|
|
607
|
+
case 'list-cycles':
|
|
608
|
+
result = await tools.listCycles(releaseId);
|
|
609
|
+
break;
|
|
610
|
+
case 'get-cycle':
|
|
611
|
+
if (!options.cycleId) {
|
|
612
|
+
console.error('Error: --cycle is required for get-cycle.');
|
|
613
|
+
process.exit(1);
|
|
614
|
+
}
|
|
615
|
+
result = await tools.getCycle(options.cycleId);
|
|
616
|
+
break;
|
|
518
617
|
|
|
519
618
|
default:
|
|
520
619
|
console.error(`Unknown tool: ${tool}`);
|
package/mcp-server.js
CHANGED
|
@@ -31,6 +31,20 @@ const TOOLS = [
|
|
|
31
31
|
required: ['projectId', 'releaseId'],
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
|
+
{
|
|
35
|
+
name: 'compare_releases',
|
|
36
|
+
description: 'Run release readiness for two releases in the same project and return a side-by-side diff across all 4 gates, including which gate statuses changed and their metric deltas.',
|
|
37
|
+
inputSchema: {
|
|
38
|
+
type: 'object',
|
|
39
|
+
properties: {
|
|
40
|
+
projectId: { type: 'number', description: 'Zephyr project ID' },
|
|
41
|
+
releaseId1: { type: 'number', description: 'First (baseline) Zephyr release ID' },
|
|
42
|
+
releaseId2: { type: 'number', description: 'Second (comparison) Zephyr release ID' },
|
|
43
|
+
query: { type: 'string', description: 'Optional Zephyr ZQL expression for Test Plan Analysis, e.g. priority = "P1"' },
|
|
44
|
+
},
|
|
45
|
+
required: ['projectId', 'releaseId1', 'releaseId2'],
|
|
46
|
+
},
|
|
47
|
+
},
|
|
34
48
|
{
|
|
35
49
|
name: 'requirement_coverage',
|
|
36
50
|
description: 'Check if requirements are covered by test cases. Threshold: ≥70% = GO.',
|
|
@@ -183,6 +197,20 @@ const TOOLS = [
|
|
|
183
197
|
required: ['projectId', 'releaseId'],
|
|
184
198
|
},
|
|
185
199
|
},
|
|
200
|
+
{
|
|
201
|
+
name: 'execution_burnup',
|
|
202
|
+
description: 'Generate a day-by-day execution burnup chart for a release. Returns cumulative executed vs ideal and total scope counts for charting progress over time.',
|
|
203
|
+
inputSchema: {
|
|
204
|
+
type: 'object',
|
|
205
|
+
properties: {
|
|
206
|
+
projectId: { type: 'number', description: 'Zephyr project ID' },
|
|
207
|
+
releaseId: { type: 'number', description: 'Zephyr release ID' },
|
|
208
|
+
startDate: { type: 'string', description: 'Burnup start date YYYY-MM-DD (default: earliest execution date)' },
|
|
209
|
+
endDate: { type: 'string', description: 'Burnup end date YYYY-MM-DD (default: today)' },
|
|
210
|
+
},
|
|
211
|
+
required: ['projectId', 'releaseId'],
|
|
212
|
+
},
|
|
213
|
+
},
|
|
186
214
|
{
|
|
187
215
|
name: 'user_trend',
|
|
188
216
|
description: 'Get full audit log activity for a user — every action they performed across the system. Filter by date range and optionally by entity type (project or release).',
|
|
@@ -220,6 +248,39 @@ const TOOLS = [
|
|
|
220
248
|
required: ['projectId'],
|
|
221
249
|
},
|
|
222
250
|
},
|
|
251
|
+
{
|
|
252
|
+
name: 'list_users',
|
|
253
|
+
description: 'List all users assigned to a project, with name, email, role, and account status.',
|
|
254
|
+
inputSchema: {
|
|
255
|
+
type: 'object',
|
|
256
|
+
properties: {
|
|
257
|
+
projectId: { type: 'number', description: 'Zephyr project ID' },
|
|
258
|
+
},
|
|
259
|
+
required: ['projectId'],
|
|
260
|
+
},
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
name: 'list_cycles',
|
|
264
|
+
description: 'List all test cycles for a release, including their phases and date ranges.',
|
|
265
|
+
inputSchema: {
|
|
266
|
+
type: 'object',
|
|
267
|
+
properties: {
|
|
268
|
+
releaseId: { type: 'number', description: 'Zephyr release ID' },
|
|
269
|
+
},
|
|
270
|
+
required: ['releaseId'],
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
name: 'get_cycle',
|
|
275
|
+
description: 'Get full detail for a single test cycle, including its phases.',
|
|
276
|
+
inputSchema: {
|
|
277
|
+
type: 'object',
|
|
278
|
+
properties: {
|
|
279
|
+
cycleId: { type: 'number', description: 'Zephyr cycle ID' },
|
|
280
|
+
},
|
|
281
|
+
required: ['cycleId'],
|
|
282
|
+
},
|
|
283
|
+
},
|
|
223
284
|
];
|
|
224
285
|
|
|
225
286
|
// ─── MCP Server ───────────────────────────────────────────────────────────────
|
|
@@ -269,6 +330,10 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
269
330
|
result = await tools.runAllGates(projectId, releaseId, { query: args.query });
|
|
270
331
|
break;
|
|
271
332
|
|
|
333
|
+
case 'compare_releases':
|
|
334
|
+
result = await tools.compareReleases(projectId, args.releaseId1, args.releaseId2, { query: args.query });
|
|
335
|
+
break;
|
|
336
|
+
|
|
272
337
|
case 'requirement_coverage':
|
|
273
338
|
result = await tools.requirementCoverageGate(projectId, releaseId);
|
|
274
339
|
break;
|
|
@@ -323,6 +388,13 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
323
388
|
});
|
|
324
389
|
break;
|
|
325
390
|
|
|
391
|
+
case 'execution_burnup':
|
|
392
|
+
result = await tools.getExecutionBurnup(projectId, releaseId, {
|
|
393
|
+
startDate: args.startDate || null,
|
|
394
|
+
endDate: args.endDate || null,
|
|
395
|
+
});
|
|
396
|
+
break;
|
|
397
|
+
|
|
326
398
|
case 'user_trend':
|
|
327
399
|
result = await tools.getUserTrend({
|
|
328
400
|
userName: args.userName,
|
|
@@ -363,6 +435,18 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
363
435
|
})),
|
|
364
436
|
};
|
|
365
437
|
break;
|
|
438
|
+
|
|
439
|
+
case 'list_users':
|
|
440
|
+
result = await tools.listUsers(projectId);
|
|
441
|
+
break;
|
|
442
|
+
|
|
443
|
+
case 'list_cycles':
|
|
444
|
+
result = await tools.listCycles(releaseId);
|
|
445
|
+
break;
|
|
446
|
+
|
|
447
|
+
case 'get_cycle':
|
|
448
|
+
result = await tools.getCycle(args.cycleId);
|
|
449
|
+
break;
|
|
366
450
|
|
|
367
451
|
default:
|
|
368
452
|
return {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zephyr-enterprise-tools",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Comprehensive Zephyr Enterprise Tools - Release Readiness, Project Health, Test Analytics & More",
|
|
5
5
|
"main": "zephyr-enterprise-tools.js",
|
|
6
6
|
"types": "zephyr-enterprise-tools.d.ts",
|
|
@@ -88,6 +88,30 @@ export interface ReleaseReadinessResult {
|
|
|
88
88
|
};
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
+
export interface GateComparison {
|
|
92
|
+
metric: string;
|
|
93
|
+
releaseA: { status: GateStatus; value: number };
|
|
94
|
+
releaseB: { status: GateStatus; value: number };
|
|
95
|
+
delta: number;
|
|
96
|
+
statusChanged: boolean;
|
|
97
|
+
trend: 'improved' | 'regressed' | 'unchanged';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export interface CompareReleasesResult {
|
|
101
|
+
projectId: number;
|
|
102
|
+
timestamp: string;
|
|
103
|
+
query?: string;
|
|
104
|
+
releaseA: { releaseId: number; projectName: string; releaseName: string; generatedAt: string; fileName: string; overallStatus: GateStatus };
|
|
105
|
+
releaseB: { releaseId: number; projectName: string; releaseName: string; generatedAt: string; fileName: string; overallStatus: GateStatus };
|
|
106
|
+
overallStatusChanged: boolean;
|
|
107
|
+
gates: {
|
|
108
|
+
requirementCoverage: GateComparison;
|
|
109
|
+
testPlanAnalysis: GateComparison;
|
|
110
|
+
testExecution: GateComparison;
|
|
111
|
+
defectQuality: GateComparison;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
91
115
|
export interface ProjectHealthResult {
|
|
92
116
|
tool: string;
|
|
93
117
|
projectId: number;
|
|
@@ -164,6 +188,14 @@ export interface UserActivityOptions {
|
|
|
164
188
|
days?: number;
|
|
165
189
|
}
|
|
166
190
|
|
|
191
|
+
export interface UserActivityTrendSummary {
|
|
192
|
+
mostActiveUser: { userId: number; name: string; executed: number } | null;
|
|
193
|
+
leastActiveUser: { userId: number; name: string; executed: number } | null;
|
|
194
|
+
avgCompletionRate: number;
|
|
195
|
+
teamVelocityTrend: 'increasing' | 'decreasing' | 'steady' | 'insufficient data';
|
|
196
|
+
velocity: { firstHalfAvgPerDay: number; secondHalfAvgPerDay: number; changePct: number } | null;
|
|
197
|
+
}
|
|
198
|
+
|
|
167
199
|
export interface UserActivityResult {
|
|
168
200
|
tool: string;
|
|
169
201
|
projectId: number;
|
|
@@ -171,6 +203,7 @@ export interface UserActivityResult {
|
|
|
171
203
|
timestamp: string;
|
|
172
204
|
period: { days: number };
|
|
173
205
|
teamSummary: Record<string, unknown>;
|
|
206
|
+
trendSummary: UserActivityTrendSummary;
|
|
174
207
|
assignedTo: unknown[];
|
|
175
208
|
executedBy: unknown[];
|
|
176
209
|
topExecutors: unknown[];
|
|
@@ -184,6 +217,121 @@ export interface TrendsOptions {
|
|
|
184
217
|
days?: number;
|
|
185
218
|
}
|
|
186
219
|
|
|
220
|
+
export interface ListUsersOptions {
|
|
221
|
+
pageSize?: number;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export interface ExecutionChartOptions {
|
|
225
|
+
startDate?: string | null;
|
|
226
|
+
endDate?: string | null;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export interface ExecutionBurnupDay {
|
|
230
|
+
date: string;
|
|
231
|
+
executedToday: number;
|
|
232
|
+
cumulativeExecuted: number;
|
|
233
|
+
remaining: number;
|
|
234
|
+
completionPct: number;
|
|
235
|
+
ideal: number;
|
|
236
|
+
scope: number;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export interface ExecutionBurnupResult {
|
|
240
|
+
tool: string;
|
|
241
|
+
projectId: number;
|
|
242
|
+
releaseId: number;
|
|
243
|
+
timestamp: string;
|
|
244
|
+
dateRange?: { from: string; to: string };
|
|
245
|
+
total: number;
|
|
246
|
+
totalPlanned: number;
|
|
247
|
+
summary?: Record<string, unknown>;
|
|
248
|
+
message?: string;
|
|
249
|
+
dailyBurnup: ExecutionBurnupDay[];
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export interface ZephyrUser {
|
|
253
|
+
id: number;
|
|
254
|
+
fullName: string;
|
|
255
|
+
userName: string;
|
|
256
|
+
email: string;
|
|
257
|
+
title?: string;
|
|
258
|
+
location?: string;
|
|
259
|
+
accountEnabled: boolean;
|
|
260
|
+
roles: number[];
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export interface ListUsersResult {
|
|
264
|
+
tool: string;
|
|
265
|
+
projectId: number;
|
|
266
|
+
timestamp: string;
|
|
267
|
+
total: number;
|
|
268
|
+
returned: number;
|
|
269
|
+
note?: string;
|
|
270
|
+
users: ZephyrUser[];
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
export interface ExecutionStatusBreakdown {
|
|
274
|
+
statusCode: number;
|
|
275
|
+
label: string;
|
|
276
|
+
count: number;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export interface ExecutionStatusCounts {
|
|
280
|
+
total: number;
|
|
281
|
+
breakdown: ExecutionStatusBreakdown[];
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
export interface CyclePhase {
|
|
285
|
+
id: number;
|
|
286
|
+
name: string;
|
|
287
|
+
startDate: string;
|
|
288
|
+
endDate: string;
|
|
289
|
+
executionStatusCounts: ExecutionStatusCounts | null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
export interface ZephyrCycle {
|
|
293
|
+
id: number;
|
|
294
|
+
name: string;
|
|
295
|
+
environment?: string;
|
|
296
|
+
build?: string;
|
|
297
|
+
startDate: string;
|
|
298
|
+
endDate: string;
|
|
299
|
+
status: number;
|
|
300
|
+
executionStatusCounts: ExecutionStatusCounts | null;
|
|
301
|
+
phases: CyclePhase[];
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
export interface ListCyclesResult {
|
|
305
|
+
tool: string;
|
|
306
|
+
releaseId: number;
|
|
307
|
+
timestamp: string;
|
|
308
|
+
total: number;
|
|
309
|
+
cycles: ZephyrCycle[];
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
export interface CyclePhaseDetail extends CyclePhase {
|
|
313
|
+
freeForm?: boolean;
|
|
314
|
+
resetExecution?: boolean;
|
|
315
|
+
hasChild?: boolean;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export interface GetCycleResult {
|
|
319
|
+
tool: string;
|
|
320
|
+
cycleId: number;
|
|
321
|
+
timestamp: string;
|
|
322
|
+
id: number;
|
|
323
|
+
name: string;
|
|
324
|
+
environment?: string;
|
|
325
|
+
build?: string;
|
|
326
|
+
startDate: string;
|
|
327
|
+
endDate: string;
|
|
328
|
+
status: number;
|
|
329
|
+
releaseId: number;
|
|
330
|
+
hasChild?: boolean;
|
|
331
|
+
executionStatusCounts: ExecutionStatusCounts | null;
|
|
332
|
+
phases: CyclePhaseDetail[];
|
|
333
|
+
}
|
|
334
|
+
|
|
187
335
|
export declare class QualityGates {
|
|
188
336
|
constructor(config: ZephyrConfig);
|
|
189
337
|
|
|
@@ -193,6 +341,7 @@ export declare class QualityGates {
|
|
|
193
341
|
testExecutionGate(projectId: number, releaseId: number): Promise<TestExecutionResult>;
|
|
194
342
|
defectQualityGate(projectId: number, releaseId: number): Promise<DefectQualityResult>;
|
|
195
343
|
runAllGates(projectId: number, releaseId: number, options?: TestPlanOptions): Promise<ReleaseReadinessResult>;
|
|
344
|
+
compareReleases(projectId: number, releaseId1: number, releaseId2: number, options?: TestPlanOptions): Promise<CompareReleasesResult>;
|
|
196
345
|
|
|
197
346
|
// Analytics & Insights
|
|
198
347
|
getProjectHealth(projectId: number, releaseId: number): Promise<ProjectHealthResult>;
|
|
@@ -202,6 +351,11 @@ export declare class QualityGates {
|
|
|
202
351
|
getTestCaseTrends(projectId: number, releaseId: number, options?: TrendsOptions): Promise<TestTrendsResult>;
|
|
203
352
|
searchTestCases(projectId: number, releaseId: number, options?: SearchTestCasesOptions): Promise<SearchTestCasesResult>;
|
|
204
353
|
getUserActivity(projectId: number, releaseId: number, options?: UserActivityOptions): Promise<UserActivityResult>;
|
|
354
|
+
getExecutionBurndown(projectId: number, releaseId: number, options?: ExecutionChartOptions): Promise<Record<string, unknown>>;
|
|
355
|
+
getExecutionBurnup(projectId: number, releaseId: number, options?: ExecutionChartOptions): Promise<ExecutionBurnupResult>;
|
|
356
|
+
listUsers(projectId: number, options?: ListUsersOptions): Promise<ListUsersResult>;
|
|
357
|
+
listCycles(releaseId: number): Promise<ListCyclesResult>;
|
|
358
|
+
getCycle(cycleId: number): Promise<GetCycleResult>;
|
|
205
359
|
}
|
|
206
360
|
|
|
207
361
|
export declare const THRESHOLDS: ThresholdConfig;
|