@neobiotechlabs/neobiotech-dev-agent 0.1.7 → 0.1.8

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 (105) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/dist/index.js +32504 -44
  4. package/dist/index.js.map +1 -1
  5. package/dist/utils/sync-version.js +20 -18
  6. package/package.json +5 -4
  7. package/dist/__tests__/adf.test.d.ts +0 -1
  8. package/dist/__tests__/adf.test.js +0 -68
  9. package/dist/__tests__/adf.test.js.map +0 -1
  10. package/dist/__tests__/annex-ii-template.test.d.ts +0 -1
  11. package/dist/__tests__/annex-ii-template.test.js +0 -39
  12. package/dist/__tests__/annex-ii-template.test.js.map +0 -1
  13. package/dist/__tests__/doc-render.test.d.ts +0 -1
  14. package/dist/__tests__/doc-render.test.js +0 -93
  15. package/dist/__tests__/doc-render.test.js.map +0 -1
  16. package/dist/__tests__/help.test.d.ts +0 -1
  17. package/dist/__tests__/help.test.js +0 -31
  18. package/dist/__tests__/help.test.js.map +0 -1
  19. package/dist/__tests__/jira-fields.test.d.ts +0 -1
  20. package/dist/__tests__/jira-fields.test.js +0 -81
  21. package/dist/__tests__/jira-fields.test.js.map +0 -1
  22. package/dist/__tests__/plugin-manifest.test.d.ts +0 -1
  23. package/dist/__tests__/plugin-manifest.test.js +0 -91
  24. package/dist/__tests__/plugin-manifest.test.js.map +0 -1
  25. package/dist/__tests__/setup.test.d.ts +0 -1
  26. package/dist/__tests__/setup.test.js +0 -7
  27. package/dist/__tests__/setup.test.js.map +0 -1
  28. package/dist/__tests__/sync-version.test.d.ts +0 -1
  29. package/dist/__tests__/sync-version.test.js +0 -37
  30. package/dist/__tests__/sync-version.test.js.map +0 -1
  31. package/dist/clients/risk-client.d.ts +0 -17
  32. package/dist/clients/risk-client.js +0 -54
  33. package/dist/clients/risk-client.js.map +0 -1
  34. package/dist/clients/xray-client.d.ts +0 -34
  35. package/dist/clients/xray-client.js +0 -127
  36. package/dist/clients/xray-client.js.map +0 -1
  37. package/dist/config/project-config.d.ts +0 -14
  38. package/dist/config/project-config.js +0 -45
  39. package/dist/config/project-config.js.map +0 -1
  40. package/dist/confluence-client.d.ts +0 -16
  41. package/dist/confluence-client.js +0 -97
  42. package/dist/confluence-client.js.map +0 -1
  43. package/dist/index.d.ts +0 -2
  44. package/dist/jira-client.d.ts +0 -35
  45. package/dist/jira-client.js +0 -119
  46. package/dist/jira-client.js.map +0 -1
  47. package/dist/tools/annex-ii-template.d.ts +0 -30
  48. package/dist/tools/annex-ii-template.js +0 -129
  49. package/dist/tools/annex-ii-template.js.map +0 -1
  50. package/dist/tools/confluence.d.ts +0 -2
  51. package/dist/tools/confluence.js +0 -54
  52. package/dist/tools/confluence.js.map +0 -1
  53. package/dist/tools/cvss.d.ts +0 -2
  54. package/dist/tools/cvss.js +0 -59
  55. package/dist/tools/cvss.js.map +0 -1
  56. package/dist/tools/doc-render.d.ts +0 -2
  57. package/dist/tools/doc-render.js +0 -96
  58. package/dist/tools/doc-render.js.map +0 -1
  59. package/dist/tools/doc-validation.d.ts +0 -2
  60. package/dist/tools/doc-validation.js +0 -221
  61. package/dist/tools/doc-validation.js.map +0 -1
  62. package/dist/tools/help-data.d.ts +0 -7
  63. package/dist/tools/help-data.js +0 -144
  64. package/dist/tools/help-data.js.map +0 -1
  65. package/dist/tools/help.d.ts +0 -2
  66. package/dist/tools/help.js +0 -39
  67. package/dist/tools/help.js.map +0 -1
  68. package/dist/tools/iec.d.ts +0 -2
  69. package/dist/tools/iec.js +0 -203
  70. package/dist/tools/iec.js.map +0 -1
  71. package/dist/tools/init.d.ts +0 -2
  72. package/dist/tools/init.js +0 -38
  73. package/dist/tools/init.js.map +0 -1
  74. package/dist/tools/jira-crud.d.ts +0 -2
  75. package/dist/tools/jira-crud.js +0 -142
  76. package/dist/tools/jira-crud.js.map +0 -1
  77. package/dist/tools/risk.d.ts +0 -2
  78. package/dist/tools/risk.js +0 -172
  79. package/dist/tools/risk.js.map +0 -1
  80. package/dist/tools/traceability.d.ts +0 -2
  81. package/dist/tools/traceability.js +0 -85
  82. package/dist/tools/traceability.js.map +0 -1
  83. package/dist/tools/types.d.ts +0 -13
  84. package/dist/tools/types.js +0 -2
  85. package/dist/tools/types.js.map +0 -1
  86. package/dist/tools/usability.d.ts +0 -2
  87. package/dist/tools/usability.js +0 -149
  88. package/dist/tools/usability.js.map +0 -1
  89. package/dist/tools/xray.d.ts +0 -2
  90. package/dist/tools/xray.js +0 -35
  91. package/dist/tools/xray.js.map +0 -1
  92. package/dist/utils/adf.d.ts +0 -27
  93. package/dist/utils/adf.js +0 -104
  94. package/dist/utils/adf.js.map +0 -1
  95. package/dist/utils/cvss.d.ts +0 -15
  96. package/dist/utils/cvss.js +0 -86
  97. package/dist/utils/cvss.js.map +0 -1
  98. package/dist/utils/doc-render.d.ts +0 -28
  99. package/dist/utils/doc-render.js +0 -50
  100. package/dist/utils/doc-render.js.map +0 -1
  101. package/dist/utils/jira-fields.d.ts +0 -38
  102. package/dist/utils/jira-fields.js +0 -53
  103. package/dist/utils/jira-fields.js.map +0 -1
  104. package/dist/utils/sync-version.d.ts +0 -2
  105. package/dist/utils/sync-version.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-version.test.js","sourceRoot":"","sources":["../../src/__tests__/sync-version.test.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- export declare class RiskClient {
2
- private baseUrl;
3
- private authHeader;
4
- private riskAuthToken;
5
- constructor(url: string, email: string, token: string, riskAuthToken: string);
6
- activateRiskPanel(issueKey: string): Promise<boolean>;
7
- setRiskValue(issueKey: string, riskConfig: {
8
- endpoint: string;
9
- author: string;
10
- riskModelKey: string;
11
- riskSetId: string;
12
- classifiers: Record<string, {
13
- id: string;
14
- options: Record<string, string>;
15
- }>;
16
- }, classifierName: string, optionName: string): Promise<boolean>;
17
- }
@@ -1,54 +0,0 @@
1
- import fetch from 'node-fetch';
2
- export class RiskClient {
3
- baseUrl;
4
- authHeader;
5
- riskAuthToken;
6
- constructor(url, email, token, riskAuthToken) {
7
- this.baseUrl = url.replace(/\/$/, '');
8
- this.authHeader = `Basic ${Buffer.from(`${email}:${token}`).toString('base64')}`;
9
- this.riskAuthToken = riskAuthToken;
10
- }
11
- async activateRiskPanel(issueKey) {
12
- const appId = '306e01a8-5530-427d-b93a-f91f4898ff16';
13
- const configId = '2a1d023a-d4a5-42c7-91e2-51a05b9eb9be';
14
- const propertyKey = `ari:cloud:ecosystem::extension/${appId}/${configId}/static/rmp-risk-value-issue-panel`;
15
- const resp = await fetch(`${this.baseUrl}/rest/api/2/issue/${issueKey}/properties/${propertyKey}`, {
16
- method: 'PUT',
17
- headers: {
18
- 'Accept': 'application/json',
19
- 'Content-Type': 'application/json',
20
- 'Authorization': this.authHeader,
21
- },
22
- body: JSON.stringify([{ added: Date.now(), id: '44c53f7b', collapsed: false }]),
23
- });
24
- return resp.ok;
25
- }
26
- async setRiskValue(issueKey, riskConfig, classifierName, optionName) {
27
- const classifier = riskConfig.classifiers[classifierName];
28
- if (!classifier)
29
- throw new Error(`Unknown classifier: ${classifierName}`);
30
- const optionId = classifier.options[optionName];
31
- if (!optionId)
32
- throw new Error(`Unknown option: ${optionName} for ${classifierName}`);
33
- const payload = {
34
- issueKey,
35
- author: riskConfig.author,
36
- riskModelKey: riskConfig.riskModelKey,
37
- riskSetId: riskConfig.riskSetId,
38
- classifierValuePayload: {
39
- classifierId: classifier.id,
40
- optionId,
41
- },
42
- };
43
- const resp = await fetch(riskConfig.endpoint, {
44
- method: 'POST',
45
- headers: {
46
- 'x-trigger-authentication': this.riskAuthToken,
47
- 'Content-Type': 'application/json',
48
- },
49
- body: JSON.stringify(payload),
50
- });
51
- return resp.ok;
52
- }
53
- }
54
- //# sourceMappingURL=risk-client.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"risk-client.js","sourceRoot":"","sources":["../../src/clients/risk-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,MAAM,OAAO,UAAU;IACb,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,aAAa,CAAS;IAE9B,YAAY,GAAW,EAAE,KAAa,EAAE,KAAa,EAAE,aAAqB;QAC1E,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,UAAU,GAAG,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAgB;QACtC,MAAM,KAAK,GAAG,sCAAsC,CAAC;QACrD,MAAM,QAAQ,GAAG,sCAAsC,CAAC;QACxD,MAAM,WAAW,GAAG,kCAAkC,KAAK,IAAI,QAAQ,oCAAoC,CAAC;QAE5G,MAAM,IAAI,GAAG,MAAM,KAAK,CACtB,GAAG,IAAI,CAAC,OAAO,qBAAqB,QAAQ,eAAe,WAAW,EAAE,EACxE;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE;gBACP,QAAQ,EAAE,kBAAkB;gBAC5B,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,IAAI,CAAC,UAAU;aACjC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;SAChF,CACF,CAAC;QACF,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,QAAgB,EAChB,UAMC,EACD,cAAsB,EACtB,UAAkB;QAElB,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,cAAc,EAAE,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,QAAQ,cAAc,EAAE,CAAC,CAAC;QAEtF,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,YAAY,EAAE,UAAU,CAAC,YAAY;YACrC,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,sBAAsB,EAAE;gBACtB,YAAY,EAAE,UAAU,CAAC,EAAE;gBAC3B,QAAQ;aACT;SACF,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,QAAQ,EAAE;YAC5C,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,0BAA0B,EAAE,IAAI,CAAC,aAAa;gBAC9C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;CACF"}
@@ -1,34 +0,0 @@
1
- interface XrayTestResult {
2
- key: string;
3
- summary: string;
4
- status: string;
5
- issue_id: string;
6
- }
7
- export declare class XrayClient {
8
- private authUrl;
9
- private apiBase;
10
- private graphqlUrl;
11
- private clientId;
12
- private clientSecret;
13
- private jiraAuthHeader;
14
- private jiraBaseUrl;
15
- private cachedToken;
16
- private tokenExpiry;
17
- constructor(clientId: string, clientSecret: string, jiraUrl: string, jiraEmail: string, jiraToken: string);
18
- private getToken;
19
- private xrayHeaders;
20
- getTestKeys(testExecutionKey: string): Promise<{
21
- test_execution: string;
22
- total: number;
23
- tests: XrayTestResult[];
24
- }>;
25
- exportCucumber(keys: string, outputDir: string): Promise<{
26
- zip_path: string;
27
- feature_dir: string;
28
- files: string[];
29
- count: number;
30
- }>;
31
- importResults(results: Record<string, unknown>): Promise<any>;
32
- createTest(projectKey: string, summary: string, gherkin?: string, labels?: string[]): Promise<any>;
33
- }
34
- export {};
@@ -1,127 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"xray-client.js","sourceRoot":"","sources":["../../src/clients/xray-client.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
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;
@@ -1,45 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,16 +0,0 @@
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
- }
@@ -1,97 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"confluence-client.js","sourceRoot":"","sources":["../src/confluence-client.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- export {};
@@ -1,35 +0,0 @@
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 };
@@ -1,119 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"jira-client.js","sourceRoot":"","sources":["../src/jira-client.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
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[];