@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.
- package/.claude-plugin/marketplace.json +22 -0
- package/.claude-plugin/plugin.json +58 -0
- package/.mcp.json +14 -0
- package/README.md +442 -0
- package/dist/__tests__/adf.test.d.ts +1 -0
- package/dist/__tests__/adf.test.js +68 -0
- package/dist/__tests__/adf.test.js.map +1 -0
- package/dist/__tests__/annex-ii-template.test.d.ts +1 -0
- package/dist/__tests__/annex-ii-template.test.js +39 -0
- package/dist/__tests__/annex-ii-template.test.js.map +1 -0
- package/dist/__tests__/doc-render.test.d.ts +1 -0
- package/dist/__tests__/doc-render.test.js +93 -0
- package/dist/__tests__/doc-render.test.js.map +1 -0
- package/dist/__tests__/help.test.d.ts +1 -0
- package/dist/__tests__/help.test.js +31 -0
- package/dist/__tests__/help.test.js.map +1 -0
- package/dist/__tests__/jira-fields.test.d.ts +1 -0
- package/dist/__tests__/jira-fields.test.js +81 -0
- package/dist/__tests__/jira-fields.test.js.map +1 -0
- package/dist/__tests__/plugin-manifest.test.d.ts +1 -0
- package/dist/__tests__/plugin-manifest.test.js +91 -0
- package/dist/__tests__/plugin-manifest.test.js.map +1 -0
- package/dist/__tests__/setup.test.d.ts +1 -0
- package/dist/__tests__/setup.test.js +7 -0
- package/dist/__tests__/setup.test.js.map +1 -0
- package/dist/__tests__/sync-version.test.d.ts +1 -0
- package/dist/__tests__/sync-version.test.js +37 -0
- package/dist/__tests__/sync-version.test.js.map +1 -0
- package/dist/clients/risk-client.d.ts +17 -0
- package/dist/clients/risk-client.js +54 -0
- package/dist/clients/risk-client.js.map +1 -0
- package/dist/clients/xray-client.d.ts +34 -0
- package/dist/clients/xray-client.js +127 -0
- package/dist/clients/xray-client.js.map +1 -0
- package/dist/config/project-config.d.ts +14 -0
- package/dist/config/project-config.js +45 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/confluence-client.d.ts +16 -0
- package/dist/confluence-client.js +97 -0
- package/dist/confluence-client.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/jira-client.d.ts +35 -0
- package/dist/jira-client.js +119 -0
- package/dist/jira-client.js.map +1 -0
- package/dist/tools/annex-ii-template.d.ts +30 -0
- package/dist/tools/annex-ii-template.js +129 -0
- package/dist/tools/annex-ii-template.js.map +1 -0
- package/dist/tools/confluence.d.ts +2 -0
- package/dist/tools/confluence.js +54 -0
- package/dist/tools/confluence.js.map +1 -0
- package/dist/tools/cvss.d.ts +2 -0
- package/dist/tools/cvss.js +59 -0
- package/dist/tools/cvss.js.map +1 -0
- package/dist/tools/doc-render.d.ts +2 -0
- package/dist/tools/doc-render.js +96 -0
- package/dist/tools/doc-render.js.map +1 -0
- package/dist/tools/doc-validation.d.ts +2 -0
- package/dist/tools/doc-validation.js +221 -0
- package/dist/tools/doc-validation.js.map +1 -0
- package/dist/tools/help-data.d.ts +7 -0
- package/dist/tools/help-data.js +144 -0
- package/dist/tools/help-data.js.map +1 -0
- package/dist/tools/help.d.ts +2 -0
- package/dist/tools/help.js +39 -0
- package/dist/tools/help.js.map +1 -0
- package/dist/tools/iec.d.ts +2 -0
- package/dist/tools/iec.js +203 -0
- package/dist/tools/iec.js.map +1 -0
- package/dist/tools/init.d.ts +2 -0
- package/dist/tools/init.js +38 -0
- package/dist/tools/init.js.map +1 -0
- package/dist/tools/jira-crud.d.ts +2 -0
- package/dist/tools/jira-crud.js +142 -0
- package/dist/tools/jira-crud.js.map +1 -0
- package/dist/tools/risk.d.ts +2 -0
- package/dist/tools/risk.js +172 -0
- package/dist/tools/risk.js.map +1 -0
- package/dist/tools/traceability.d.ts +2 -0
- package/dist/tools/traceability.js +85 -0
- package/dist/tools/traceability.js.map +1 -0
- package/dist/tools/types.d.ts +13 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/usability.d.ts +2 -0
- package/dist/tools/usability.js +149 -0
- package/dist/tools/usability.js.map +1 -0
- package/dist/tools/xray.d.ts +2 -0
- package/dist/tools/xray.js +35 -0
- package/dist/tools/xray.js.map +1 -0
- package/dist/utils/adf.d.ts +27 -0
- package/dist/utils/adf.js +104 -0
- package/dist/utils/adf.js.map +1 -0
- package/dist/utils/cvss.d.ts +15 -0
- package/dist/utils/cvss.js +86 -0
- package/dist/utils/cvss.js.map +1 -0
- package/dist/utils/doc-render.d.ts +28 -0
- package/dist/utils/doc-render.js +50 -0
- package/dist/utils/doc-render.js.map +1 -0
- package/dist/utils/jira-fields.d.ts +38 -0
- package/dist/utils/jira-fields.js +53 -0
- package/dist/utils/jira-fields.js.map +1 -0
- package/dist/utils/sync-version.d.ts +2 -0
- package/dist/utils/sync-version.js +20 -0
- package/dist/utils/sync-version.js.map +1 -0
- package/package.json +49 -0
- package/skills/doc-render/SKILL.md +79 -0
- package/vendor/dev-docs-templates/templates/dev_docs/plan_template.md +104 -0
- package/vendor/dev-docs-templates/templates/dev_docs/prd_template.md +110 -0
- package/vendor/dev-docs-templates/templates/dev_docs/spec_template.md +81 -0
- package/vendor/dev-docs-templates/templates/dev_docs/tasks_template.md +122 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/checklist-clinical-evaluation.md +81 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/checklist-gspr-mdr.md +403 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/clinical-evaluation-report.md +492 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/instructions-for-use.md +132 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/literature-evaluation-table.md +15 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/mdr-declaration-of-conformity.md +75 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/post-market-clinical-follow-up-plan.md +162 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/post-market-surveillance-plan.md +175 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/risk-management-cybersecurity-checklist.md +67 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/risk-management-report.md +111 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/CA/usability-evaluation-report.md +70 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/clinical-evaluation-plan.md +154 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/list-of-hazard-related-use-scenarios.md +34 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/risk-table-fmea.md +155 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/software-architecture-description.md +307 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/software-requirements-list.md +156 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/soup-list.md +82 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/EA/usability-evaluation-plan.md +103 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/bug-fixes-documentation-list.md +35 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/change-evaluation-list.md +100 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/list-of-known-anomalies.md +29 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/algorithm-validation-report.md +170 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/checklist-software-release.md +52 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/checklist-software-requirements-review.md +50 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-architecture-checklist.md +41 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-detailed-design.md +321 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-system-test-plan.md +155 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/usability-evaluation-protocol.md +63 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/PA/intended-use.md +116 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/PA/mdr-classification-document.md +114 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/PA/risk-management-plan.md +198 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/PA/software-development-maintenance-plan.md +225 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/PA/system-requirements-spec.md +182 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/information_security/information-security-controls.md +966 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/information_security/information-security-policy-and-scope.md +99 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/quality-manual-policy-objectives.md +187 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-capa.md +112 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-change-management.md +128 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-clinical-evaluation.md +102 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-feedback-management.md +140 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-integrated-software-development.md +361 -0
- package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-post-market-surveillance.md +159 -0
- 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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"}
|
package/dist/index.d.ts
ADDED
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":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;AAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;AAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;AAEnD,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;IACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvE,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC;AAC/D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AAE1E,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC;AACtD,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;AAC9D,MAAM,IAAI,GAAG,YAAY,IAAI,gBAAgB;IAC3C,CAAC,CAAC,IAAI,UAAU,CAAC,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC;IAC/E,CAAC,CAAC,IAAI,CAAC;AAET,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,iBAAiB;IACvB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,qBAAqB;AACrB,MAAM,GAAG,GAAgB,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAClE,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC3B,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC7B,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACvB,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACvB,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACvB,yBAAyB,CAAC,GAAG,CAAC,CAAC;AAC/B,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACtB,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACvB,sBAAsB,CAAC,GAAG,CAAC,CAAC;AAC5B,0BAA0B,CAAC,GAAG,CAAC,CAAC;AAChC,iBAAiB,CAAC,GAAG,CAAC,CAAC;AACvB,sBAAsB,CAAC,GAAG,CAAC,CAAC;AAE5B,mBAAmB;AACnB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACpC,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -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[];
|