zephyr-enterprise-tools 1.0.6 → 1.2.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
@@ -53,7 +53,25 @@ export ZEPHYR_TOKEN="your-api-token"
53
53
 
54
54
  ## 🤖 MCP Integration
55
55
 
56
- Use zephyr-enterprise-tools as an MCP (Model Context Protocol) server with your AI assistant.
56
+ Use zephyr-enterprise-tools as an MCP (Model Context Protocol) server with your AI assistant. The server only requires `ZEPHYR_BASE_URL` and `ZEPHYR_TOKEN` at startup - **Project ID and Release ID are passed as parameters when calling each tool**.
57
+
58
+ ### Available MCP Tools
59
+
60
+ | Tool | Description |
61
+ |------|-------------|
62
+ | `list_projects` | List all Zephyr projects (no parameters needed) |
63
+ | `list_releases` | List releases for a project (requires projectId) |
64
+ | `release_readiness` | Run all 4 quality gates |
65
+ | `requirement_coverage` | Check requirement coverage |
66
+ | `test_plan_analysis` | Analyze test planning status |
67
+ | `test_execution` | Check test execution progress |
68
+ | `defect_quality` | Analyze defect status |
69
+ | `project_health` | Get project health score |
70
+ | `test_coverage` | Get test coverage details |
71
+ | `failed_tests` | List failed tests |
72
+ | `test_trends` | Get execution trends over time |
73
+ | `search_test_cases` | Search test cases by query |
74
+ | `user_activity` | Get user activity metrics |
57
75
 
58
76
  ### VS Code with GitHub Copilot
59
77
 
@@ -65,10 +83,7 @@ Create or edit `.vscode/mcp.json` in your workspace:
65
83
  "zephyr-enterprise": {
66
84
  "type": "stdio",
67
85
  "command": "npx",
68
- "args": [
69
- "-y",
70
- "zephyr-enterprise-tools@latest"
71
- ],
86
+ "args": ["-y", "zephyr-enterprise-tools@latest", "mcp"],
72
87
  "env": {
73
88
  "ZEPHYR_BASE_URL": "${input:zephyr_base_url}",
74
89
  "ZEPHYR_TOKEN": "${input:zephyr_token}"
@@ -101,10 +116,7 @@ Add to your `mcp.json` configuration:
101
116
  "mcpServers": {
102
117
  "zephyr-enterprise": {
103
118
  "command": "npx",
104
- "args": [
105
- "-y",
106
- "zephyr-enterprise-tools@latest"
107
- ],
119
+ "args": ["-y", "zephyr-enterprise-tools@latest", "mcp"],
108
120
  "env": {
109
121
  "ZEPHYR_BASE_URL": "https://your-zephyr.com/flex/services/rest/latest",
110
122
  "ZEPHYR_TOKEN": "your-api-token"
@@ -123,10 +135,7 @@ Edit your `claude_desktop_config.json` file:
123
135
  "mcpServers": {
124
136
  "zephyr-enterprise": {
125
137
  "command": "npx",
126
- "args": [
127
- "-y",
128
- "zephyr-enterprise-tools@latest"
129
- ],
138
+ "args": ["-y", "zephyr-enterprise-tools@latest", "mcp"],
130
139
  "env": {
131
140
  "ZEPHYR_BASE_URL": "https://your-zephyr.com/flex/services/rest/latest",
132
141
  "ZEPHYR_TOKEN": "your-api-token"
package/cli.js CHANGED
@@ -12,10 +12,22 @@
12
12
  * zephyr-tools --project 364 --release 4312
13
13
  * zephyr-tools -p 364 -r 4312 -t project-health
14
14
  * zephyr-tools -p 364 -r 4312 -t search-tests -q "login"
15
+ * zephyr-tools mcp # Start MCP server
15
16
  */
16
17
 
17
18
  import QualityGates from './zephyr-enterprise-tools.js';
18
19
 
20
+ // Check if MCP server mode
21
+ if (process.argv[2] === 'mcp') {
22
+ import('./mcp-server.js');
23
+ } else {
24
+ main().catch(err => {
25
+ console.error(`Error: ${err.message}`);
26
+ if (process.env.DEBUG) console.error(err.stack);
27
+ process.exit(1);
28
+ });
29
+ }
30
+
19
31
  // ─── Parse Arguments ──────────────────────────────────────────────────────────
20
32
 
21
33
  function parseArgs() {
@@ -535,5 +547,3 @@ async function main() {
535
547
  process.exit(1);
536
548
  }
537
549
  }
538
-
539
- main();
package/mcp-server.js ADDED
@@ -0,0 +1,345 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Zephyr Enterprise MCP Server
5
+ *
6
+ * Model Context Protocol server for Zephyr Enterprise Tools.
7
+ * Exposes all tools with projectId and releaseId as runtime parameters.
8
+ */
9
+
10
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
11
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
12
+ import {
13
+ CallToolRequestSchema,
14
+ ListToolsRequestSchema,
15
+ } from '@modelcontextprotocol/sdk/types.js';
16
+ import QualityGates from './zephyr-enterprise-tools.js';
17
+
18
+ // ─── Tool Definitions ─────────────────────────────────────────────────────────
19
+
20
+ const TOOLS = [
21
+ {
22
+ name: 'release_readiness',
23
+ description: 'Run all 4 quality gates to assess release readiness. Returns GO, CONDITIONAL GO, or NO GO status.',
24
+ inputSchema: {
25
+ type: 'object',
26
+ properties: {
27
+ projectId: { type: 'number', description: 'Zephyr project ID' },
28
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
29
+ },
30
+ required: ['projectId', 'releaseId'],
31
+ },
32
+ },
33
+ {
34
+ name: 'requirement_coverage',
35
+ description: 'Check if requirements are covered by test cases. Threshold: ≥70% = GO.',
36
+ inputSchema: {
37
+ type: 'object',
38
+ properties: {
39
+ projectId: { type: 'number', description: 'Zephyr project ID' },
40
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
41
+ },
42
+ required: ['projectId', 'releaseId'],
43
+ },
44
+ },
45
+ {
46
+ name: 'test_plan_analysis',
47
+ description: 'Analyze test planning status. Threshold: <80% = NO GO, 80-90% = CONDITIONAL, ≥90% = GO.',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ projectId: { type: 'number', description: 'Zephyr project ID' },
52
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
53
+ },
54
+ required: ['projectId', 'releaseId'],
55
+ },
56
+ },
57
+ {
58
+ name: 'test_execution',
59
+ description: 'Check test execution progress. Threshold: <90% = NO GO, 90-97% = CONDITIONAL, ≥97% = GO.',
60
+ inputSchema: {
61
+ type: 'object',
62
+ properties: {
63
+ projectId: { type: 'number', description: 'Zephyr project ID' },
64
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
65
+ },
66
+ required: ['projectId', 'releaseId'],
67
+ },
68
+ },
69
+ {
70
+ name: 'defect_quality',
71
+ description: 'Analyze defect status. Threshold: Blocker >0 = NO GO, High-risk >10 = NO GO.',
72
+ inputSchema: {
73
+ type: 'object',
74
+ properties: {
75
+ projectId: { type: 'number', description: 'Zephyr project ID' },
76
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
77
+ },
78
+ required: ['projectId', 'releaseId'],
79
+ },
80
+ },
81
+ {
82
+ name: 'project_health',
83
+ description: 'Get overall project health score (0-100) with metrics, team info, releases, and recommendations.',
84
+ inputSchema: {
85
+ type: 'object',
86
+ properties: {
87
+ projectId: { type: 'number', description: 'Zephyr project ID' },
88
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
89
+ },
90
+ required: ['projectId', 'releaseId'],
91
+ },
92
+ },
93
+ {
94
+ name: 'test_coverage',
95
+ description: 'Get detailed test coverage analysis including requirements and test case coverage.',
96
+ inputSchema: {
97
+ type: 'object',
98
+ properties: {
99
+ projectId: { type: 'number', description: 'Zephyr project ID' },
100
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
101
+ },
102
+ required: ['projectId', 'releaseId'],
103
+ },
104
+ },
105
+ {
106
+ name: 'failed_tests',
107
+ description: 'List and analyze failed test cases with details.',
108
+ inputSchema: {
109
+ type: 'object',
110
+ properties: {
111
+ projectId: { type: 'number', description: 'Zephyr project ID' },
112
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
113
+ limit: { type: 'number', description: 'Maximum number of failed tests to return (default: 50)' },
114
+ },
115
+ required: ['projectId', 'releaseId'],
116
+ },
117
+ },
118
+ {
119
+ name: 'requirement_coverage_details',
120
+ description: 'Get requirements with and without test coverage.',
121
+ inputSchema: {
122
+ type: 'object',
123
+ properties: {
124
+ projectId: { type: 'number', description: 'Zephyr project ID' },
125
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
126
+ },
127
+ required: ['projectId', 'releaseId'],
128
+ },
129
+ },
130
+ {
131
+ name: 'test_trends',
132
+ description: 'Get test execution trends over time (daily breakdown).',
133
+ inputSchema: {
134
+ type: 'object',
135
+ properties: {
136
+ projectId: { type: 'number', description: 'Zephyr project ID' },
137
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
138
+ days: { type: 'number', description: 'Number of days to analyze (default: 30)' },
139
+ },
140
+ required: ['projectId', 'releaseId'],
141
+ },
142
+ },
143
+ {
144
+ name: 'search_test_cases',
145
+ description: 'Search test cases by query string.',
146
+ inputSchema: {
147
+ type: 'object',
148
+ properties: {
149
+ projectId: { type: 'number', description: 'Zephyr project ID' },
150
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
151
+ query: { type: 'string', description: 'Search query string' },
152
+ limit: { type: 'number', description: 'Maximum results (default: 50)' },
153
+ },
154
+ required: ['projectId', 'releaseId'],
155
+ },
156
+ },
157
+ {
158
+ name: 'user_activity',
159
+ description: 'Get user activity and productivity metrics showing who is assigned and who executed tests.',
160
+ inputSchema: {
161
+ type: 'object',
162
+ properties: {
163
+ projectId: { type: 'number', description: 'Zephyr project ID' },
164
+ releaseId: { type: 'number', description: 'Zephyr release ID' },
165
+ days: { type: 'number', description: 'Number of days to analyze (default: 30)' },
166
+ },
167
+ required: ['projectId', 'releaseId'],
168
+ },
169
+ },
170
+ {
171
+ name: 'list_projects',
172
+ description: 'List all available Zephyr projects.',
173
+ inputSchema: {
174
+ type: 'object',
175
+ properties: {},
176
+ required: [],
177
+ },
178
+ },
179
+ {
180
+ name: 'list_releases',
181
+ description: 'List all releases for a project.',
182
+ inputSchema: {
183
+ type: 'object',
184
+ properties: {
185
+ projectId: { type: 'number', description: 'Zephyr project ID' },
186
+ },
187
+ required: ['projectId'],
188
+ },
189
+ },
190
+ ];
191
+
192
+ // ─── MCP Server ───────────────────────────────────────────────────────────────
193
+
194
+ const server = new Server(
195
+ {
196
+ name: 'zephyr-enterprise-tools',
197
+ version: '1.0.6',
198
+ },
199
+ {
200
+ capabilities: {
201
+ tools: {},
202
+ },
203
+ }
204
+ );
205
+
206
+ // Create QualityGates instance
207
+ let tools;
208
+ try {
209
+ tools = new QualityGates({
210
+ baseUrl: process.env.ZEPHYR_BASE_URL,
211
+ token: process.env.ZEPHYR_TOKEN,
212
+ });
213
+ } catch (err) {
214
+ console.error(`Configuration error: ${err.message}`);
215
+ process.exit(1);
216
+ }
217
+
218
+ // ─── List Tools Handler ───────────────────────────────────────────────────────
219
+
220
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
221
+ return { tools: TOOLS };
222
+ });
223
+
224
+ // ─── Call Tool Handler ────────────────────────────────────────────────────────
225
+
226
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
227
+ const { name, arguments: args } = request.params;
228
+
229
+ try {
230
+ let result;
231
+ const projectId = args.projectId;
232
+ const releaseId = args.releaseId;
233
+
234
+ switch (name) {
235
+ case 'release_readiness':
236
+ result = await tools.runAllGates(projectId, releaseId);
237
+ break;
238
+
239
+ case 'requirement_coverage':
240
+ result = await tools.requirementCoverageGate(projectId, releaseId);
241
+ break;
242
+
243
+ case 'test_plan_analysis':
244
+ result = await tools.testPlanAnalysisGate(projectId, releaseId);
245
+ break;
246
+
247
+ case 'test_execution':
248
+ result = await tools.testExecutionGate(projectId, releaseId);
249
+ break;
250
+
251
+ case 'defect_quality':
252
+ result = await tools.defectQualityGate(projectId, releaseId);
253
+ break;
254
+
255
+ case 'project_health':
256
+ result = await tools.getProjectHealth(projectId, releaseId);
257
+ break;
258
+
259
+ case 'test_coverage':
260
+ result = await tools.getTestCoverage(projectId, releaseId);
261
+ break;
262
+
263
+ case 'failed_tests':
264
+ result = await tools.getFailedTests(projectId, releaseId, { limit: args.limit || 50 });
265
+ break;
266
+
267
+ case 'requirement_coverage_details':
268
+ result = await tools.getRequirementCoverage(projectId, releaseId);
269
+ break;
270
+
271
+ case 'test_trends':
272
+ result = await tools.getTestCaseTrends(projectId, releaseId, { days: args.days || 30 });
273
+ break;
274
+
275
+ case 'search_test_cases':
276
+ result = await tools.searchTestCases(projectId, releaseId, {
277
+ query: args.query || '',
278
+ limit: args.limit || 50
279
+ });
280
+ break;
281
+
282
+ case 'user_activity':
283
+ result = await tools.getUserActivity(projectId, releaseId, { days: args.days || 30 });
284
+ break;
285
+
286
+ case 'list_projects':
287
+ const projects = await tools.GET('/project');
288
+ result = {
289
+ total: projects.length,
290
+ projects: projects.map(p => ({
291
+ id: p.id,
292
+ name: p.name,
293
+ description: p.description,
294
+ startDate: p.projectStartDate,
295
+ endDate: p.projectEndDate,
296
+ })),
297
+ };
298
+ break;
299
+
300
+ case 'list_releases':
301
+ const releases = await tools.GET('/release', { projectid: projectId, isaliasallowed: false });
302
+ const filtered = releases.filter(r => !r.projectRelease);
303
+ result = {
304
+ projectId,
305
+ total: filtered.length,
306
+ releases: filtered.map(r => ({
307
+ id: r.id,
308
+ name: r.name,
309
+ startDate: r.releaseStartDate,
310
+ endDate: r.releaseEndDate,
311
+ })),
312
+ };
313
+ break;
314
+
315
+ default:
316
+ return {
317
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
318
+ isError: true,
319
+ };
320
+ }
321
+
322
+ return {
323
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
324
+ };
325
+
326
+ } catch (error) {
327
+ return {
328
+ content: [{ type: 'text', text: `Error: ${error.message}` }],
329
+ isError: true,
330
+ };
331
+ }
332
+ });
333
+
334
+ // ─── Start Server ─────────────────────────────────────────────────────────────
335
+
336
+ async function main() {
337
+ const transport = new StdioServerTransport();
338
+ await server.connect(transport);
339
+ console.error('Zephyr Enterprise MCP Server running on stdio');
340
+ }
341
+
342
+ main().catch((error) => {
343
+ console.error('Fatal error:', error);
344
+ process.exit(1);
345
+ });
package/package.json CHANGED
@@ -1,21 +1,31 @@
1
1
  {
2
2
  "name": "zephyr-enterprise-tools",
3
- "version": "1.0.6",
3
+ "version": "1.2.1",
4
4
  "description": "Comprehensive Zephyr Enterprise Tools - Release Readiness, Project Health, Test Analytics & More",
5
5
  "main": "zephyr-enterprise-tools.js",
6
+ "types": "zephyr-enterprise-tools.d.ts",
6
7
  "exports": {
7
- ".": "./zephyr-enterprise-tools.js",
8
- "./cli": "./cli.js"
8
+ ".": {
9
+ "import": "./zephyr-enterprise-tools.js",
10
+ "types": "./zephyr-enterprise-tools.d.ts"
11
+ },
12
+ "./cli": "./cli.js",
13
+ "./mcp": "./mcp-server.js"
9
14
  },
10
15
  "bin": {
11
16
  "zephyr-gates": "cli.js",
12
- "zephyr-tools": "cli.js"
17
+ "zephyr-tools": "cli.js",
18
+ "zephyr-mcp": "mcp-server.js"
13
19
  },
14
20
  "type": "module",
15
21
  "scripts": {
16
22
  "start": "node cli.js",
23
+ "mcp": "node mcp-server.js",
17
24
  "test": "node cli.js --help"
18
25
  },
26
+ "dependencies": {
27
+ "@modelcontextprotocol/sdk": "^1.0.0"
28
+ },
19
29
  "keywords": [
20
30
  "zephyr",
21
31
  "zephyr-enterprise",
@@ -46,7 +56,9 @@
46
56
  },
47
57
  "files": [
48
58
  "zephyr-enterprise-tools.js",
59
+ "zephyr-enterprise-tools.d.ts",
49
60
  "cli.js",
61
+ "mcp-server.js",
50
62
  "README.md",
51
63
  "LICENSE"
52
64
  ]
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Zephyr Enterprise Tools - TypeScript Declarations
3
+ */
4
+
5
+ export interface ZephyrConfig {
6
+ baseUrl?: string;
7
+ token?: string;
8
+ }
9
+
10
+ export interface ThresholdConfig {
11
+ requirementCoverage: { go: number; description: string };
12
+ testPlanAnalysis: { noGo: number; conditionalGo: number; description: string };
13
+ testExecution: { noGo: number; conditionalGo: number; description: string };
14
+ defectQuality: { blockerLimit: number; highRiskLimit: number; description: string };
15
+ }
16
+
17
+ export type GateStatus = "GO" | "CONDITIONAL GO" | "NO GO";
18
+ export type HealthStatus = "HEALTHY" | "MODERATE" | "AT RISK" | "CRITICAL";
19
+
20
+ export interface GateResult {
21
+ gate: string;
22
+ status: GateStatus;
23
+ statusMessage: string;
24
+ [key: string]: unknown;
25
+ }
26
+
27
+ export interface RequirementCoverageResult extends GateResult {
28
+ coveragePercentage: number;
29
+ coveredRequirements: number;
30
+ notCoveredRequirements: number;
31
+ totalRequirements: number;
32
+ }
33
+
34
+ export interface TestPlanResult extends GateResult {
35
+ overallPlanningPercentage: number;
36
+ totalTests: number;
37
+ plannedTests: number;
38
+ assignedTests: number;
39
+ }
40
+
41
+ export interface TestExecutionResult extends GateResult {
42
+ executionPercentage: number;
43
+ completedTests: number;
44
+ totalPlannedTests: number;
45
+ breakdown: {
46
+ passed: number;
47
+ failed: number;
48
+ blocked: number;
49
+ wip: number;
50
+ notExecuted: number;
51
+ };
52
+ }
53
+
54
+ export interface DefectQualityResult extends GateResult {
55
+ totalDefects: number;
56
+ breakdown: {
57
+ blocker: { count: number; defects: unknown[] };
58
+ highRisk: { count: number; defects: unknown[] };
59
+ lowRisk: { count: number; defects: unknown[] };
60
+ resolved: { count: number };
61
+ };
62
+ }
63
+
64
+ export interface ReleaseReadinessResult {
65
+ projectId: number;
66
+ releaseId: number;
67
+ timestamp: string;
68
+ overallStatus: GateStatus;
69
+ summary: { passed: number; failed: number; conditional: number };
70
+ recommendation: string;
71
+ gates: {
72
+ requirementCoverage: RequirementCoverageResult;
73
+ testPlanAnalysis: TestPlanResult;
74
+ testExecution: TestExecutionResult;
75
+ defectQuality: DefectQualityResult;
76
+ };
77
+ }
78
+
79
+ export interface ProjectHealthResult {
80
+ tool: string;
81
+ projectId: number;
82
+ releaseId: number;
83
+ timestamp: string;
84
+ healthScore: number;
85
+ healthStatus: HealthStatus;
86
+ summary: Record<string, unknown>;
87
+ metrics: Record<string, Record<string, unknown>>;
88
+ recommendations: string[];
89
+ }
90
+
91
+ export interface TestCoverageResult {
92
+ tool: string;
93
+ projectId: number;
94
+ releaseId: number;
95
+ timestamp: string;
96
+ summary: Record<string, unknown>;
97
+ [key: string]: unknown;
98
+ }
99
+
100
+ export interface FailedTest {
101
+ testcaseId: number;
102
+ testcaseKey: string;
103
+ testcaseName: string;
104
+ executedBy?: string;
105
+ [key: string]: unknown;
106
+ }
107
+
108
+ export interface FailedTestsResult {
109
+ tool: string;
110
+ projectId: number;
111
+ releaseId: number;
112
+ timestamp: string;
113
+ failedTests: FailedTest[];
114
+ total: number;
115
+ }
116
+
117
+ export interface RequirementCoverageDetailResult {
118
+ tool: string;
119
+ projectId: number;
120
+ releaseId: number;
121
+ timestamp: string;
122
+ results: unknown[];
123
+ [key: string]: unknown;
124
+ }
125
+
126
+ export interface TestTrendsResult {
127
+ tool: string;
128
+ projectId: number;
129
+ releaseId: number;
130
+ timestamp: string;
131
+ dailyTrends: Array<{ date: string; total: number; passed: number; failed: number; blocked: number }>;
132
+ [key: string]: unknown;
133
+ }
134
+
135
+ export interface SearchTestCasesOptions {
136
+ query?: string;
137
+ limit?: number;
138
+ }
139
+
140
+ export interface SearchTestCasesResult {
141
+ tool: string;
142
+ projectId: number;
143
+ releaseId: number;
144
+ timestamp: string;
145
+ results: Array<{ id: number; key: string; name: string; status?: string }>;
146
+ totalMatches: number;
147
+ returned: number;
148
+ }
149
+
150
+ export interface UserActivityOptions {
151
+ days?: number;
152
+ }
153
+
154
+ export interface UserActivityResult {
155
+ tool: string;
156
+ projectId: number;
157
+ releaseId: number;
158
+ timestamp: string;
159
+ period: { days: number };
160
+ teamSummary: Record<string, unknown>;
161
+ assignedTo: unknown[];
162
+ executedBy: unknown[];
163
+ topExecutors: unknown[];
164
+ }
165
+
166
+ export interface FailedTestsOptions {
167
+ limit?: number;
168
+ }
169
+
170
+ export interface TrendsOptions {
171
+ days?: number;
172
+ }
173
+
174
+ export declare class QualityGates {
175
+ constructor(config: ZephyrConfig);
176
+
177
+ // Quality Gates (Release Readiness)
178
+ requirementCoverageGate(projectId: number, releaseId: number): Promise<RequirementCoverageResult>;
179
+ testPlanAnalysisGate(projectId: number, releaseId: number): Promise<TestPlanResult>;
180
+ testExecutionGate(projectId: number, releaseId: number): Promise<TestExecutionResult>;
181
+ defectQualityGate(projectId: number, releaseId: number): Promise<DefectQualityResult>;
182
+ runAllGates(projectId: number, releaseId: number): Promise<ReleaseReadinessResult>;
183
+
184
+ // Analytics & Insights
185
+ getProjectHealth(projectId: number, releaseId: number): Promise<ProjectHealthResult>;
186
+ getTestCoverage(projectId: number, releaseId: number): Promise<TestCoverageResult>;
187
+ getFailedTests(projectId: number, releaseId: number, options?: FailedTestsOptions): Promise<FailedTestsResult>;
188
+ getRequirementCoverage(projectId: number, releaseId: number): Promise<RequirementCoverageDetailResult>;
189
+ getTestCaseTrends(projectId: number, releaseId: number, options?: TrendsOptions): Promise<TestTrendsResult>;
190
+ searchTestCases(projectId: number, releaseId: number, options?: SearchTestCasesOptions): Promise<SearchTestCasesResult>;
191
+ getUserActivity(projectId: number, releaseId: number, options?: UserActivityOptions): Promise<UserActivityResult>;
192
+ }
193
+
194
+ export declare const THRESHOLDS: ThresholdConfig;
195
+ export declare const RESOLVED_STATUSES: string[];
196
+ export declare const BLOCKER_PRIORITIES: string[];
197
+ export declare const HIGH_RISK_PRIORITIES: string[];
198
+ export declare const LOW_RISK_PRIORITIES: string[];
199
+
200
+ /** Alias for QualityGates — kept for backward compatibility */
201
+ export { QualityGates as ZephyrTools };
202
+ export default QualityGates;