@neobiotechlabs/neobiotech-dev-agent 0.1.7

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 (155) hide show
  1. package/.claude-plugin/marketplace.json +22 -0
  2. package/.claude-plugin/plugin.json +58 -0
  3. package/.mcp.json +14 -0
  4. package/README.md +442 -0
  5. package/dist/__tests__/adf.test.d.ts +1 -0
  6. package/dist/__tests__/adf.test.js +68 -0
  7. package/dist/__tests__/adf.test.js.map +1 -0
  8. package/dist/__tests__/annex-ii-template.test.d.ts +1 -0
  9. package/dist/__tests__/annex-ii-template.test.js +39 -0
  10. package/dist/__tests__/annex-ii-template.test.js.map +1 -0
  11. package/dist/__tests__/doc-render.test.d.ts +1 -0
  12. package/dist/__tests__/doc-render.test.js +93 -0
  13. package/dist/__tests__/doc-render.test.js.map +1 -0
  14. package/dist/__tests__/help.test.d.ts +1 -0
  15. package/dist/__tests__/help.test.js +31 -0
  16. package/dist/__tests__/help.test.js.map +1 -0
  17. package/dist/__tests__/jira-fields.test.d.ts +1 -0
  18. package/dist/__tests__/jira-fields.test.js +81 -0
  19. package/dist/__tests__/jira-fields.test.js.map +1 -0
  20. package/dist/__tests__/plugin-manifest.test.d.ts +1 -0
  21. package/dist/__tests__/plugin-manifest.test.js +91 -0
  22. package/dist/__tests__/plugin-manifest.test.js.map +1 -0
  23. package/dist/__tests__/setup.test.d.ts +1 -0
  24. package/dist/__tests__/setup.test.js +7 -0
  25. package/dist/__tests__/setup.test.js.map +1 -0
  26. package/dist/__tests__/sync-version.test.d.ts +1 -0
  27. package/dist/__tests__/sync-version.test.js +37 -0
  28. package/dist/__tests__/sync-version.test.js.map +1 -0
  29. package/dist/clients/risk-client.d.ts +17 -0
  30. package/dist/clients/risk-client.js +54 -0
  31. package/dist/clients/risk-client.js.map +1 -0
  32. package/dist/clients/xray-client.d.ts +34 -0
  33. package/dist/clients/xray-client.js +127 -0
  34. package/dist/clients/xray-client.js.map +1 -0
  35. package/dist/config/project-config.d.ts +14 -0
  36. package/dist/config/project-config.js +45 -0
  37. package/dist/config/project-config.js.map +1 -0
  38. package/dist/confluence-client.d.ts +16 -0
  39. package/dist/confluence-client.js +97 -0
  40. package/dist/confluence-client.js.map +1 -0
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.js +60 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/jira-client.d.ts +35 -0
  45. package/dist/jira-client.js +119 -0
  46. package/dist/jira-client.js.map +1 -0
  47. package/dist/tools/annex-ii-template.d.ts +30 -0
  48. package/dist/tools/annex-ii-template.js +129 -0
  49. package/dist/tools/annex-ii-template.js.map +1 -0
  50. package/dist/tools/confluence.d.ts +2 -0
  51. package/dist/tools/confluence.js +54 -0
  52. package/dist/tools/confluence.js.map +1 -0
  53. package/dist/tools/cvss.d.ts +2 -0
  54. package/dist/tools/cvss.js +59 -0
  55. package/dist/tools/cvss.js.map +1 -0
  56. package/dist/tools/doc-render.d.ts +2 -0
  57. package/dist/tools/doc-render.js +96 -0
  58. package/dist/tools/doc-render.js.map +1 -0
  59. package/dist/tools/doc-validation.d.ts +2 -0
  60. package/dist/tools/doc-validation.js +221 -0
  61. package/dist/tools/doc-validation.js.map +1 -0
  62. package/dist/tools/help-data.d.ts +7 -0
  63. package/dist/tools/help-data.js +144 -0
  64. package/dist/tools/help-data.js.map +1 -0
  65. package/dist/tools/help.d.ts +2 -0
  66. package/dist/tools/help.js +39 -0
  67. package/dist/tools/help.js.map +1 -0
  68. package/dist/tools/iec.d.ts +2 -0
  69. package/dist/tools/iec.js +203 -0
  70. package/dist/tools/iec.js.map +1 -0
  71. package/dist/tools/init.d.ts +2 -0
  72. package/dist/tools/init.js +38 -0
  73. package/dist/tools/init.js.map +1 -0
  74. package/dist/tools/jira-crud.d.ts +2 -0
  75. package/dist/tools/jira-crud.js +142 -0
  76. package/dist/tools/jira-crud.js.map +1 -0
  77. package/dist/tools/risk.d.ts +2 -0
  78. package/dist/tools/risk.js +172 -0
  79. package/dist/tools/risk.js.map +1 -0
  80. package/dist/tools/traceability.d.ts +2 -0
  81. package/dist/tools/traceability.js +85 -0
  82. package/dist/tools/traceability.js.map +1 -0
  83. package/dist/tools/types.d.ts +13 -0
  84. package/dist/tools/types.js +2 -0
  85. package/dist/tools/types.js.map +1 -0
  86. package/dist/tools/usability.d.ts +2 -0
  87. package/dist/tools/usability.js +149 -0
  88. package/dist/tools/usability.js.map +1 -0
  89. package/dist/tools/xray.d.ts +2 -0
  90. package/dist/tools/xray.js +35 -0
  91. package/dist/tools/xray.js.map +1 -0
  92. package/dist/utils/adf.d.ts +27 -0
  93. package/dist/utils/adf.js +104 -0
  94. package/dist/utils/adf.js.map +1 -0
  95. package/dist/utils/cvss.d.ts +15 -0
  96. package/dist/utils/cvss.js +86 -0
  97. package/dist/utils/cvss.js.map +1 -0
  98. package/dist/utils/doc-render.d.ts +28 -0
  99. package/dist/utils/doc-render.js +50 -0
  100. package/dist/utils/doc-render.js.map +1 -0
  101. package/dist/utils/jira-fields.d.ts +38 -0
  102. package/dist/utils/jira-fields.js +53 -0
  103. package/dist/utils/jira-fields.js.map +1 -0
  104. package/dist/utils/sync-version.d.ts +2 -0
  105. package/dist/utils/sync-version.js +20 -0
  106. package/dist/utils/sync-version.js.map +1 -0
  107. package/package.json +49 -0
  108. package/skills/doc-render/SKILL.md +79 -0
  109. package/vendor/dev-docs-templates/templates/dev_docs/plan_template.md +104 -0
  110. package/vendor/dev-docs-templates/templates/dev_docs/prd_template.md +110 -0
  111. package/vendor/dev-docs-templates/templates/dev_docs/spec_template.md +81 -0
  112. package/vendor/dev-docs-templates/templates/dev_docs/tasks_template.md +122 -0
  113. package/vendor/dev-docs-templates/templates/mdr_docs/CA/checklist-clinical-evaluation.md +81 -0
  114. package/vendor/dev-docs-templates/templates/mdr_docs/CA/checklist-gspr-mdr.md +403 -0
  115. package/vendor/dev-docs-templates/templates/mdr_docs/CA/clinical-evaluation-report.md +492 -0
  116. package/vendor/dev-docs-templates/templates/mdr_docs/CA/instructions-for-use.md +132 -0
  117. package/vendor/dev-docs-templates/templates/mdr_docs/CA/literature-evaluation-table.md +15 -0
  118. package/vendor/dev-docs-templates/templates/mdr_docs/CA/mdr-declaration-of-conformity.md +75 -0
  119. package/vendor/dev-docs-templates/templates/mdr_docs/CA/post-market-clinical-follow-up-plan.md +162 -0
  120. package/vendor/dev-docs-templates/templates/mdr_docs/CA/post-market-surveillance-plan.md +175 -0
  121. package/vendor/dev-docs-templates/templates/mdr_docs/CA/risk-management-cybersecurity-checklist.md +67 -0
  122. package/vendor/dev-docs-templates/templates/mdr_docs/CA/risk-management-report.md +111 -0
  123. package/vendor/dev-docs-templates/templates/mdr_docs/CA/usability-evaluation-report.md +70 -0
  124. package/vendor/dev-docs-templates/templates/mdr_docs/EA/clinical-evaluation-plan.md +154 -0
  125. package/vendor/dev-docs-templates/templates/mdr_docs/EA/list-of-hazard-related-use-scenarios.md +34 -0
  126. package/vendor/dev-docs-templates/templates/mdr_docs/EA/risk-table-fmea.md +155 -0
  127. package/vendor/dev-docs-templates/templates/mdr_docs/EA/software-architecture-description.md +307 -0
  128. package/vendor/dev-docs-templates/templates/mdr_docs/EA/software-requirements-list.md +156 -0
  129. package/vendor/dev-docs-templates/templates/mdr_docs/EA/soup-list.md +82 -0
  130. package/vendor/dev-docs-templates/templates/mdr_docs/EA/usability-evaluation-plan.md +103 -0
  131. package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/bug-fixes-documentation-list.md +35 -0
  132. package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/change-evaluation-list.md +100 -0
  133. package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/list-of-known-anomalies.md +29 -0
  134. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/algorithm-validation-report.md +170 -0
  135. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/checklist-software-release.md +52 -0
  136. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/checklist-software-requirements-review.md +50 -0
  137. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-architecture-checklist.md +41 -0
  138. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-detailed-design.md +321 -0
  139. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-system-test-plan.md +155 -0
  140. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/usability-evaluation-protocol.md +63 -0
  141. package/vendor/dev-docs-templates/templates/mdr_docs/PA/intended-use.md +116 -0
  142. package/vendor/dev-docs-templates/templates/mdr_docs/PA/mdr-classification-document.md +114 -0
  143. package/vendor/dev-docs-templates/templates/mdr_docs/PA/risk-management-plan.md +198 -0
  144. package/vendor/dev-docs-templates/templates/mdr_docs/PA/software-development-maintenance-plan.md +225 -0
  145. package/vendor/dev-docs-templates/templates/mdr_docs/PA/system-requirements-spec.md +182 -0
  146. package/vendor/dev-docs-templates/templates/mdr_docs/global/information_security/information-security-controls.md +966 -0
  147. package/vendor/dev-docs-templates/templates/mdr_docs/global/information_security/information-security-policy-and-scope.md +99 -0
  148. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/quality-manual-policy-objectives.md +187 -0
  149. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-capa.md +112 -0
  150. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-change-management.md +128 -0
  151. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-clinical-evaluation.md +102 -0
  152. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-feedback-management.md +140 -0
  153. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-integrated-software-development.md +361 -0
  154. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-post-market-surveillance.md +159 -0
  155. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-software-problem-resolution.md +99 -0
@@ -0,0 +1,127 @@
1
+ import fetch from 'node-fetch';
2
+ import AdmZip from 'adm-zip';
3
+ import { writeFileSync, mkdirSync, readdirSync } from 'fs';
4
+ import { join } from 'path';
5
+ export class XrayClient {
6
+ authUrl = 'https://xray.cloud.getxray.app/api/v2/authenticate';
7
+ apiBase = 'https://xray.cloud.getxray.app/api/v2';
8
+ graphqlUrl = 'https://xray.cloud.getxray.app/api/v2/graphql';
9
+ clientId;
10
+ clientSecret;
11
+ jiraAuthHeader;
12
+ jiraBaseUrl;
13
+ cachedToken = null;
14
+ tokenExpiry = 0;
15
+ constructor(clientId, clientSecret, jiraUrl, jiraEmail, jiraToken) {
16
+ this.clientId = clientId;
17
+ this.clientSecret = clientSecret;
18
+ this.jiraBaseUrl = jiraUrl;
19
+ this.jiraAuthHeader = `Basic ${Buffer.from(`${jiraEmail}:${jiraToken}`).toString('base64')}`;
20
+ }
21
+ async getToken() {
22
+ if (this.cachedToken && Date.now() < this.tokenExpiry)
23
+ return this.cachedToken;
24
+ const resp = await fetch(this.authUrl, {
25
+ method: 'POST',
26
+ headers: { 'Content-Type': 'application/json' },
27
+ body: JSON.stringify({ client_id: this.clientId, client_secret: this.clientSecret }),
28
+ });
29
+ if (!resp.ok)
30
+ throw new Error(`Xray auth failed: ${resp.status} ${await resp.text()}`);
31
+ const raw = await resp.text();
32
+ this.cachedToken = raw.replace(/"/g, '');
33
+ this.tokenExpiry = Date.now() + 55 * 60 * 1000;
34
+ return this.cachedToken;
35
+ }
36
+ async xrayHeaders() {
37
+ return { 'Content-Type': 'application/json', 'Authorization': `Bearer ${await this.getToken()}` };
38
+ }
39
+ async getTestKeys(testExecutionKey) {
40
+ const jiraResp = await fetch(`${this.jiraBaseUrl}/rest/api/3/issue/${testExecutionKey}?fields=summary`, { headers: { Accept: 'application/json', Authorization: this.jiraAuthHeader } });
41
+ if (!jiraResp.ok)
42
+ throw new Error(`Jira fetch failed: ${jiraResp.status}`);
43
+ const jiraData = await jiraResp.json();
44
+ const issueId = jiraData.id;
45
+ const query = `query($issueId: String!) {
46
+ getTestExecution(issueId: $issueId) {
47
+ issueId
48
+ tests(limit: 100) {
49
+ total
50
+ results {
51
+ issueId
52
+ status { name color }
53
+ jira(fields: ["key", "summary"])
54
+ }
55
+ }
56
+ }
57
+ }`;
58
+ const resp = await fetch(this.graphqlUrl, {
59
+ method: 'POST',
60
+ headers: await this.xrayHeaders(),
61
+ body: JSON.stringify({ query, variables: { issueId } }),
62
+ });
63
+ if (!resp.ok)
64
+ throw new Error(`Xray GraphQL failed: ${resp.status} ${await resp.text()}`);
65
+ const data = await resp.json();
66
+ const tests = data?.data?.getTestExecution?.tests?.results || [];
67
+ return {
68
+ test_execution: testExecutionKey,
69
+ total: data?.data?.getTestExecution?.tests?.total || 0,
70
+ tests: tests.map((t) => ({
71
+ key: t.jira?.key || '',
72
+ summary: t.jira?.summary || '',
73
+ status: t.status?.name || '',
74
+ issue_id: t.issueId || '',
75
+ })),
76
+ };
77
+ }
78
+ async exportCucumber(keys, outputDir) {
79
+ const resp = await fetch(`${this.apiBase}/export/cucumber?keys=${keys}`, {
80
+ headers: await this.xrayHeaders(),
81
+ });
82
+ if (!resp.ok)
83
+ throw new Error(`Cucumber export failed: ${resp.status} ${await resp.text()}`);
84
+ const buffer = Buffer.from(await resp.arrayBuffer());
85
+ mkdirSync(outputDir, { recursive: true });
86
+ const zipPath = join(outputDir, 'xray-features.zip');
87
+ writeFileSync(zipPath, buffer);
88
+ const zip = new AdmZip(zipPath);
89
+ zip.extractAllTo(outputDir, true);
90
+ const files = readdirSync(outputDir).filter(f => f.endsWith('.feature'));
91
+ return { zip_path: zipPath, feature_dir: outputDir, files, count: files.length };
92
+ }
93
+ async importResults(results) {
94
+ const resp = await fetch(`${this.apiBase}/import/execution`, {
95
+ method: 'POST',
96
+ headers: await this.xrayHeaders(),
97
+ body: JSON.stringify(results),
98
+ });
99
+ if (!resp.ok)
100
+ throw new Error(`Xray import failed: ${resp.status} ${await resp.text()}`);
101
+ return resp.json();
102
+ }
103
+ async createTest(projectKey, summary, gherkin, labels) {
104
+ const projResp = await fetch(`${this.jiraBaseUrl}/rest/api/3/project/${projectKey}`, {
105
+ headers: { Accept: 'application/json', Authorization: this.jiraAuthHeader },
106
+ });
107
+ if (!projResp.ok)
108
+ throw new Error(`Project fetch failed: ${projResp.status}`);
109
+ const projData = await projResp.json();
110
+ const projectId = projData.id;
111
+ const query = `mutation($issueType: String!, $projectId: String!, $summary: String!, $gherkin: String, $labels: [String]) {
112
+ createTest(issueType: $issueType, projectId: $projectId, summary: $summary, gherkin: $gherkin, labels: $labels) {
113
+ id
114
+ key
115
+ }
116
+ }`;
117
+ const resp = await fetch(this.graphqlUrl, {
118
+ method: 'POST',
119
+ headers: await this.xrayHeaders(),
120
+ body: JSON.stringify({ query, variables: { issueType: 'Test', projectId, summary, gherkin: gherkin || undefined, labels: labels || undefined } }),
121
+ });
122
+ if (!resp.ok)
123
+ throw new Error(`Xray createTest failed: ${resp.status} ${await resp.text()}`);
124
+ return resp.json();
125
+ }
126
+ }
127
+ //# sourceMappingURL=xray-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xray-client.js","sourceRoot":"","sources":["../../src/clients/xray-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export interface RiskManagementConfig {
2
+ endpoint: string;
3
+ author: string;
4
+ risk_model_key: string;
5
+ risk_sets: {
6
+ initial: string;
7
+ current: string;
8
+ };
9
+ classifiers: Record<string, {
10
+ id: string;
11
+ options: Record<string, string>;
12
+ }>;
13
+ }
14
+ export declare function getRiskConfig(_projectKey: string): RiskManagementConfig;
@@ -0,0 +1,45 @@
1
+ const RISK_DEFAULTS = {
2
+ endpoint: 'https://306e01a8-5530-427d-b93a-f91f4898ff16.hello.atlassian-dev.net/x1/p3_h8rdLbpp1-9mjDOXQiqJ4jL4',
3
+ author: '712020:baa962da-2822-4cc7-9659-2d780f703b3e',
4
+ risk_model_key: 'risk-model-9dc1c741-0858-4a96-65d6-5feaf052da71',
5
+ risk_sets: {
6
+ initial: '2f43f135-d043-84bd-4222-46ba4a309738',
7
+ current: 'f957cae9-a34c-30d7-557b-f7f29a414ba5',
8
+ },
9
+ classifiers: {
10
+ severity: {
11
+ id: '120dbe93-8a5c-89d9-398c-6fdefc8fa072',
12
+ options: {
13
+ negligible: '0750b204-3be7-14b2-34c9-5100846e99db',
14
+ minor: '70ccea9f-a585-d248-dbd0-e6eefcc683e8',
15
+ serious: 'a8b765c0-2e55-f6c4-25ff-1a4513c1cfd7',
16
+ critical: '587d166e-890a-5123-e179-15bafbd617e1',
17
+ catastrophic: '981fbfd5-604d-f9b9-6765-3405a165f401',
18
+ },
19
+ },
20
+ p1: {
21
+ id: 'c2c0af5d-74de-e463-ad13-ba80da1b6afd',
22
+ options: {
23
+ improvable: '3ac4a3b1-55ef-de93-3452-61c572a905a3',
24
+ remote: '2d173a68-c28f-d589-1300-bc127f962810',
25
+ occasional: '039596ac-784e-f0ac-50cf-d4d2cc96b096',
26
+ probable: '702cb81f-3bc6-d150-5cc3-daa04d3f0404',
27
+ frequent: '09fb301a-4448-d8aa-afd2-76d371f501f3',
28
+ },
29
+ },
30
+ p2: {
31
+ id: 'cdada7bb-cb4a-3b00-260b-5e5227e85a74',
32
+ options: {
33
+ improvable: '7e044b34-25c4-ffae-5237-48eebb190358',
34
+ remote: '58257cb8-59e2-5ec7-dd1d-9e966fb13589',
35
+ occasional: '6cf5ebce-3b07-69b1-b093-9e0ef9def95c',
36
+ probable: 'bbcbfdd1-0c02-6105-e8e4-f60ae6cacb5c',
37
+ frequent: 'e35de539-93d5-f854-c6ed-50067ad8599b',
38
+ },
39
+ },
40
+ },
41
+ };
42
+ export function getRiskConfig(_projectKey) {
43
+ return RISK_DEFAULTS;
44
+ }
45
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../../src/config/project-config.ts"],"names":[],"mappings":"AAQA,MAAM,aAAa,GAAyB;IAC1C,QAAQ,EAAE,qGAAqG;IAC/G,MAAM,EAAE,6CAA6C;IACrD,cAAc,EAAE,iDAAiD;IACjE,SAAS,EAAE;QACT,OAAO,EAAE,sCAAsC;QAC/C,OAAO,EAAE,sCAAsC;KAChD;IACD,WAAW,EAAE;QACX,QAAQ,EAAE;YACR,EAAE,EAAE,sCAAsC;YAC1C,OAAO,EAAE;gBACP,UAAU,EAAE,sCAAsC;gBAClD,KAAK,EAAE,sCAAsC;gBAC7C,OAAO,EAAE,sCAAsC;gBAC/C,QAAQ,EAAE,sCAAsC;gBAChD,YAAY,EAAE,sCAAsC;aACrD;SACF;QACD,EAAE,EAAE;YACF,EAAE,EAAE,sCAAsC;YAC1C,OAAO,EAAE;gBACP,UAAU,EAAE,sCAAsC;gBAClD,MAAM,EAAE,sCAAsC;gBAC9C,UAAU,EAAE,sCAAsC;gBAClD,QAAQ,EAAE,sCAAsC;gBAChD,QAAQ,EAAE,sCAAsC;aACjD;SACF;QACD,EAAE,EAAE;YACF,EAAE,EAAE,sCAAsC;YAC1C,OAAO,EAAE;gBACP,UAAU,EAAE,sCAAsC;gBAClD,MAAM,EAAE,sCAAsC;gBAC9C,UAAU,EAAE,sCAAsC;gBAClD,QAAQ,EAAE,sCAAsC;gBAChD,QAAQ,EAAE,sCAAsC;aACjD;SACF;KACF;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export declare class ConfluenceClient {
2
+ private baseUrl;
3
+ private auth;
4
+ constructor(url: string, email: string, token: string);
5
+ private headers;
6
+ private authHeader;
7
+ getPage(pageId: string, expand?: string[]): Promise<unknown>;
8
+ search(cql: string, limit?: number): Promise<unknown>;
9
+ createPage(spaceKey: string, title: string, body: string, parentId?: string): Promise<unknown>;
10
+ updatePage(pageId: string, title: string, body: string, version: number): Promise<unknown>;
11
+ deletePage(pageId: string): Promise<{
12
+ success: boolean;
13
+ }>;
14
+ getSpaces(): Promise<unknown>;
15
+ getPageChildren(pageId: string, limit?: number): Promise<unknown>;
16
+ }
@@ -0,0 +1,97 @@
1
+ import fetch from 'node-fetch';
2
+ export class ConfluenceClient {
3
+ baseUrl;
4
+ auth;
5
+ constructor(url, email, token) {
6
+ this.baseUrl = url.replace(/\/$/, '');
7
+ this.auth = { username: email, password: token };
8
+ }
9
+ headers() {
10
+ return {
11
+ 'Accept': 'application/json',
12
+ 'Content-Type': 'application/json',
13
+ };
14
+ }
15
+ authHeader() {
16
+ return `Basic ${Buffer.from(`${this.auth.username}:${this.auth.password}`).toString('base64')}`;
17
+ }
18
+ async getPage(pageId, expand) {
19
+ const params = expand?.length ? `?expand=${expand.join(',')}` : '';
20
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/content/${pageId}${params}`, { headers: { ...this.headers(), Authorization: this.authHeader() } });
21
+ if (!resp.ok)
22
+ throw new Error(`Confluence get ${resp.status}: ${await resp.text()}`);
23
+ return resp.json();
24
+ }
25
+ async search(cql, limit = 25) {
26
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/content/search?cql=${encodeURIComponent(cql)}&limit=${limit}`, { headers: { ...this.headers(), Authorization: this.authHeader() } });
27
+ if (!resp.ok)
28
+ throw new Error(`Confluence search ${resp.status}: ${await resp.text()}`);
29
+ return resp.json();
30
+ }
31
+ async createPage(spaceKey, title, body, parentId) {
32
+ const payload = {
33
+ type: 'page',
34
+ title,
35
+ space: { key: spaceKey },
36
+ body: {
37
+ storage: {
38
+ value: body,
39
+ representation: 'storage',
40
+ },
41
+ },
42
+ };
43
+ if (parentId) {
44
+ payload.ancestors = [{ id: parentId }];
45
+ }
46
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/content`, {
47
+ method: 'POST',
48
+ headers: { ...this.headers(), Authorization: this.authHeader() },
49
+ body: JSON.stringify(payload),
50
+ });
51
+ if (!resp.ok)
52
+ throw new Error(`Confluence create ${resp.status}: ${await resp.text()}`);
53
+ return resp.json();
54
+ }
55
+ async updatePage(pageId, title, body, version) {
56
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/content/${pageId}`, {
57
+ method: 'PUT',
58
+ headers: { ...this.headers(), Authorization: this.authHeader() },
59
+ body: JSON.stringify({
60
+ type: 'page',
61
+ title,
62
+ version: { number: version + 1 },
63
+ body: {
64
+ storage: {
65
+ value: body,
66
+ representation: 'storage',
67
+ },
68
+ },
69
+ }),
70
+ });
71
+ if (!resp.ok)
72
+ throw new Error(`Confluence update ${resp.status}: ${await resp.text()}`);
73
+ return resp.json();
74
+ }
75
+ async deletePage(pageId) {
76
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/content/${pageId}`, {
77
+ method: 'DELETE',
78
+ headers: { ...this.headers(), Authorization: this.authHeader() },
79
+ });
80
+ if (!resp.ok)
81
+ throw new Error(`Confluence delete ${resp.status}: ${await resp.text()}`);
82
+ return { success: true };
83
+ }
84
+ async getSpaces() {
85
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/space?limit=100`, { headers: { ...this.headers(), Authorization: this.authHeader() } });
86
+ if (!resp.ok)
87
+ throw new Error(`Confluence spaces ${resp.status}: ${await resp.text()}`);
88
+ return resp.json();
89
+ }
90
+ async getPageChildren(pageId, limit = 25) {
91
+ const resp = await fetch(`${this.baseUrl}/wiki/rest/api/content/${pageId}/child/page?limit=${limit}`, { headers: { ...this.headers(), Authorization: this.authHeader() } });
92
+ if (!resp.ok)
93
+ throw new Error(`Confluence children ${resp.status}: ${await resp.text()}`);
94
+ return resp.json();
95
+ }
96
+ }
97
+ //# sourceMappingURL=confluence-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confluence-client.js","sourceRoot":"","sources":["../src/confluence-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { JiraClient } from './jira-client.js';
5
+ import { ConfluenceClient } from './confluence-client.js';
6
+ import { RiskClient } from './clients/risk-client.js';
7
+ import { XrayClient } from './clients/xray-client.js';
8
+ import { registerJiraCrudTools } from './tools/jira-crud.js';
9
+ import { registerConfluenceTools } from './tools/confluence.js';
10
+ import { registerRiskTools } from './tools/risk.js';
11
+ import { registerCvssTools } from './tools/cvss.js';
12
+ import { registerXrayTools } from './tools/xray.js';
13
+ import { registerTraceabilityTools } from './tools/traceability.js';
14
+ import { registerIecTools } from './tools/iec.js';
15
+ import { registerHelpTools } from './tools/help.js';
16
+ import { registerUsabilityTools } from './tools/usability.js';
17
+ import { registerDocValidationTools } from './tools/doc-validation.js';
18
+ import { registerInitTools } from './tools/init.js';
19
+ import { registerDocRenderTools } from './tools/doc-render.js';
20
+ const jiraUrl = process.env.JIRA_URL || '';
21
+ const jiraEmail = process.env.JIRA_EMAIL || '';
22
+ const jiraToken = process.env.JIRA_API_TOKEN || '';
23
+ if (!jiraUrl || !jiraEmail || !jiraToken) {
24
+ console.error('Missing JIRA_URL, JIRA_EMAIL, or JIRA_API_TOKEN environment variables');
25
+ process.exit(1);
26
+ }
27
+ const jira = new JiraClient(jiraUrl, jiraEmail, jiraToken);
28
+ const confluence = new ConfluenceClient(jiraUrl, jiraEmail, jiraToken);
29
+ const riskAuthToken = process.env.RISK_PLUGIN_AUTH_TOKEN || '';
30
+ const risk = new RiskClient(jiraUrl, jiraEmail, jiraToken, riskAuthToken);
31
+ const xrayClientId = process.env.XRAY_CLIENT_ID || '';
32
+ const xrayClientSecret = process.env.XRAY_CLIENT_SECRET || '';
33
+ const xray = xrayClientId && xrayClientSecret
34
+ ? new XrayClient(xrayClientId, xrayClientSecret, jiraUrl, jiraEmail, jiraToken)
35
+ : null;
36
+ const server = new McpServer({
37
+ name: 'jira-confluence',
38
+ version: '0.1.0',
39
+ });
40
+ // Register all tools
41
+ const ctx = { server, jira, confluence, risk, xray };
42
+ registerJiraCrudTools(ctx);
43
+ registerConfluenceTools(ctx);
44
+ registerRiskTools(ctx);
45
+ registerCvssTools(ctx);
46
+ registerXrayTools(ctx);
47
+ registerTraceabilityTools(ctx);
48
+ registerIecTools(ctx);
49
+ registerHelpTools(ctx);
50
+ registerUsabilityTools(ctx);
51
+ registerDocValidationTools(ctx);
52
+ registerInitTools(ctx);
53
+ registerDocRenderTools(ctx);
54
+ // Start the server
55
+ const transport = new StdioServerTransport();
56
+ server.connect(transport).catch(err => {
57
+ console.error('Failed to start MCP server:', err);
58
+ process.exit(1);
59
+ });
60
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { textToAdf } from './utils/adf.js';
2
+ export declare class JiraClient {
3
+ private baseUrl;
4
+ private authHeader;
5
+ constructor(url: string, email: string, token: string);
6
+ private headers;
7
+ private request;
8
+ getIssue(key: string, fields?: string[]): Promise<any>;
9
+ search(jql: string, maxResults?: number, fields?: string[]): Promise<any>;
10
+ createIssue(fields: Record<string, unknown>): Promise<any>;
11
+ updateIssue(key: string, fields: Record<string, unknown>): Promise<any>;
12
+ addComment(key: string, body: string): Promise<any>;
13
+ createLink(linkType: string, inwardKey: string, outwardKey: string): Promise<any>;
14
+ deleteLink(linkId: string): Promise<any>;
15
+ getLinks(key: string): Promise<any>;
16
+ getTransitions(key: string): Promise<any>;
17
+ transition(key: string, transitionId: string): Promise<any>;
18
+ deleteIssue(key: string): Promise<any>;
19
+ getIssueTypeSchema(projectKey: string, issueTypeId?: string): Promise<{
20
+ issueTypes: {
21
+ id: any;
22
+ name: any;
23
+ fields: {
24
+ key: string;
25
+ name: any;
26
+ type: any;
27
+ custom: any;
28
+ inferredFormat: string;
29
+ required: any;
30
+ allowedValues: any;
31
+ }[];
32
+ }[];
33
+ }>;
34
+ }
35
+ export { textToAdf };
@@ -0,0 +1,119 @@
1
+ import fetch from 'node-fetch';
2
+ import { textToAdf } from './utils/adf.js';
3
+ import { inferFieldFormat } from './utils/jira-fields.js';
4
+ export class JiraClient {
5
+ baseUrl;
6
+ authHeader;
7
+ constructor(url, email, token) {
8
+ this.baseUrl = url.replace(/\/$/, '');
9
+ this.authHeader = `Basic ${Buffer.from(`${email}:${token}`).toString('base64')}`;
10
+ // node-fetch는 WHATWG 표준을 따라 301/302 리다이렉트 시 POST를 GET으로 변환한다.
11
+ // http URL에서 이슈 생성/수정(POST/PUT)이 조용히 실패하므로 https 사용을 권장.
12
+ if (/^http:\/\//i.test(this.baseUrl)) {
13
+ console.error(`[jira-mcp] WARNING: JIRA_URL이 http입니다 (${this.baseUrl}). 리다이렉트 시 POST가 GET으로 변환되어 이슈 생성/수정이 실패할 수 있습니다. https URL을 사용하세요.`);
14
+ }
15
+ }
16
+ headers() {
17
+ return {
18
+ 'Accept': 'application/json',
19
+ 'Content-Type': 'application/json',
20
+ 'Authorization': this.authHeader,
21
+ };
22
+ }
23
+ async request(path, options = {}) {
24
+ const resp = await fetch(`${this.baseUrl}/rest/api/3${path}`, {
25
+ method: options.method || 'GET',
26
+ headers: this.headers(),
27
+ body: options.body ? JSON.stringify(options.body) : undefined,
28
+ });
29
+ if (!resp.ok) {
30
+ const text = await resp.text();
31
+ if (resp.status === 204)
32
+ return null;
33
+ throw new Error(`Jira API ${resp.status}: ${text}`);
34
+ }
35
+ const text = await resp.text();
36
+ return text ? JSON.parse(text) : null;
37
+ }
38
+ async getIssue(key, fields) {
39
+ const params = fields ? `?fields=${fields.join(',')}` : '';
40
+ return this.request(`/issue/${key}${params}`);
41
+ }
42
+ async search(jql, maxResults = 50, fields) {
43
+ return this.request('/search/jql', {
44
+ method: 'POST',
45
+ body: { jql, maxResults, fields: fields || ['summary', 'status', 'issuetype', 'description', 'priority', 'labels'] },
46
+ });
47
+ }
48
+ async createIssue(fields) {
49
+ return this.request('/issue', { method: 'POST', body: { fields } });
50
+ }
51
+ async updateIssue(key, fields) {
52
+ return this.request(`/issue/${key}`, { method: 'PUT', body: { fields } });
53
+ }
54
+ async addComment(key, body) {
55
+ return this.request(`/issue/${key}/comment`, { method: 'POST', body: { body: textToAdf(body) } });
56
+ }
57
+ async createLink(linkType, inwardKey, outwardKey) {
58
+ return this.request('/issueLink', {
59
+ method: 'POST',
60
+ body: { type: { name: linkType }, inwardIssue: { key: inwardKey }, outwardIssue: { key: outwardKey } },
61
+ });
62
+ }
63
+ async deleteLink(linkId) {
64
+ return this.request(`/issueLink/${linkId}`, { method: 'DELETE' });
65
+ }
66
+ async getLinks(key) {
67
+ const data = await this.getIssue(key, ['issuelinks']);
68
+ return data.fields?.issuelinks || [];
69
+ }
70
+ async getTransitions(key) {
71
+ return this.request(`/issue/${key}/transitions`);
72
+ }
73
+ async transition(key, transitionId) {
74
+ return this.request(`/issue/${key}/transitions`, { method: 'POST', body: { transition: { id: transitionId } } });
75
+ }
76
+ async deleteIssue(key) {
77
+ return this.request(`/issue/${key}`, { method: 'DELETE' });
78
+ }
79
+ async getIssueTypeSchema(projectKey, issueTypeId) {
80
+ const [createmeta, fields] = await Promise.all([
81
+ this.request(`/issue/createmeta?projectKeys=${projectKey}${issueTypeId ? `&issuetypeIds=${issueTypeId}` : ''}&expand=projects.issuetypes.fields`),
82
+ this.request('/field'),
83
+ ]);
84
+ const customFieldMap = new Map();
85
+ for (const f of fields) {
86
+ customFieldMap.set(f.id, { name: f.name, type: f.schema?.type || 'unknown', custom: f.schema?.custom });
87
+ }
88
+ const project = createmeta.projects?.[0];
89
+ if (!project)
90
+ return { issueTypes: [] };
91
+ return {
92
+ issueTypes: project.issuetypes.map(it => ({
93
+ id: it.id,
94
+ name: it.name,
95
+ fields: Object.entries(it.fields).map(([key, val]) => {
96
+ const meta = customFieldMap.get(key);
97
+ const type = val.schema?.type || meta?.type || 'unknown';
98
+ const custom = val.schema?.custom || meta?.custom;
99
+ const hasAllowedValues = !!(val.allowedValues?.length);
100
+ return {
101
+ key,
102
+ name: val.name || meta?.name || key,
103
+ type,
104
+ // createmeta의 type이 부정확할 수 있어(실제론 ADF인데 string으로 보고),
105
+ // /field의 schema.custom과 함께 inferredFormat 힌트를 제공한다.
106
+ custom,
107
+ inferredFormat: inferFieldFormat(type, custom, hasAllowedValues),
108
+ required: val.required || false,
109
+ allowedValues: val.allowedValues || undefined,
110
+ };
111
+ }),
112
+ })),
113
+ };
114
+ }
115
+ }
116
+ // 하위 호환: 기존에 jira-client.js에서 textToAdf를 import하던 코드(jira-crud, iec 등) 유지.
117
+ // 실제 구현은 utils/adf.ts에 있다 (순환 import 회피).
118
+ export { textToAdf };
119
+ //# sourceMappingURL=jira-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jira-client.js","sourceRoot":"","sources":["../src/jira-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export interface DocSection {
2
+ id: string;
3
+ title: string;
4
+ required: boolean;
5
+ description: string;
6
+ matchKeywords: string[];
7
+ expectedSubTypes?: string[];
8
+ requireApproval?: boolean;
9
+ }
10
+ export interface CompletenessResult {
11
+ section: DocSection;
12
+ status: 'found' | 'missing' | 'incomplete';
13
+ tickets: Array<{
14
+ key: string;
15
+ summary: string;
16
+ status: string;
17
+ issuetype: string;
18
+ }>;
19
+ issues: string[];
20
+ }
21
+ export declare const ANNEX_II_TEMPLATE: {
22
+ sections: DocSection[];
23
+ };
24
+ export declare function matchSection(summary: string): DocSection | undefined;
25
+ export declare function checkCompleteness(sections: DocSection[], tickets: Array<{
26
+ key: string;
27
+ summary: string;
28
+ status: string;
29
+ issuetype: string;
30
+ }>): CompletenessResult[];