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 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
- > **`execution_burndown` date range** — Use `startDate` and `endDate` (format: `YYYY-MM-DD`) to scope the burndown to a specific period within the release window.
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.2.8",
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;