@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,20 +1,22 @@
1
- // package.json version을 plugin.json/marketplace.json에 주입하는 순수 함수 (I/O 없음).
2
- // 2-space 들여쓰기 + 후행 줄바꿈 유지 (기존 매니페스트 파일 포맷과 일치).
3
- const stringify = (obj) => JSON.stringify(obj, null, 2) + '\n';
4
- export function injectPluginVersion(pluginJson, version) {
5
- const obj = JSON.parse(pluginJson);
6
- obj.version = version;
7
- return stringify(obj);
1
+ // src/utils/sync-version.ts
2
+ var stringify = (obj) => JSON.stringify(obj, null, 2) + "\n";
3
+ function injectPluginVersion(pluginJson, version) {
4
+ const obj = JSON.parse(pluginJson);
5
+ obj.version = version;
6
+ return stringify(obj);
8
7
  }
9
- export function injectMarketplaceVersion(marketplaceJson, version) {
10
- const obj = JSON.parse(marketplaceJson);
11
- if (!Array.isArray(obj.plugins) || obj.plugins.length === 0) {
12
- throw new Error('marketplace.json must have at least one plugin entry');
13
- }
14
- if (!obj.plugins[0].source || typeof obj.plugins[0].source !== 'object') {
15
- obj.plugins[0].source = {};
16
- }
17
- obj.plugins[0].source.version = version;
18
- return stringify(obj);
8
+ function injectMarketplaceVersion(marketplaceJson, version) {
9
+ const obj = JSON.parse(marketplaceJson);
10
+ if (!Array.isArray(obj.plugins) || obj.plugins.length === 0) {
11
+ throw new Error("marketplace.json must have at least one plugin entry");
12
+ }
13
+ if (!obj.plugins[0].source || typeof obj.plugins[0].source !== "object") {
14
+ obj.plugins[0].source = {};
15
+ }
16
+ obj.plugins[0].source.version = version;
17
+ return stringify(obj);
19
18
  }
20
- //# sourceMappingURL=sync-version.js.map
19
+ export {
20
+ injectMarketplaceVersion,
21
+ injectPluginVersion
22
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neobiotechlabs/neobiotech-dev-agent",
3
- "version": "0.1.7",
3
+ "version": "0.1.8",
4
4
  "description": "Jira & Confluence MCP Server for Claude Code",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -8,12 +8,12 @@
8
8
  "neobiotech-dev-agent": "dist/index.js"
9
9
  },
10
10
  "scripts": {
11
- "build": "tsc",
12
- "dev": "tsc --watch",
11
+ "build": "tsc --noEmit && tsup",
12
+ "dev": "tsup --watch",
13
13
  "start": "node dist/index.js",
14
14
  "test": "vitest run",
15
15
  "test:watch": "vitest",
16
- "prepublishOnly": "npm run build && node scripts/sync-plugin-version.mjs"
16
+ "prepublishOnly": "npm run build && node scripts/sync-plugin-version.mjs && chmod +x dist/index.js"
17
17
  },
18
18
  "keywords": [
19
19
  "mcp",
@@ -43,6 +43,7 @@
43
43
  "devDependencies": {
44
44
  "@types/adm-zip": "^0.5.8",
45
45
  "@types/node": "^22.0.0",
46
+ "tsup": "^8.5.1",
46
47
  "typescript": "^5.7.0",
47
48
  "vitest": "^4.1.6"
48
49
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,68 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { adfToMarkdown, textToAdf } from '../utils/adf.js';
3
- const p = (text) => ({ type: 'paragraph', content: [{ type: 'text', text }] });
4
- const doc = (...content) => ({ type: 'doc', version: 1, content });
5
- describe('adfToMarkdown', () => {
6
- it('빈/undefined/비객체 → 빈 문자열', () => {
7
- expect(adfToMarkdown(undefined)).toBe('');
8
- expect(adfToMarkdown(null)).toBe('');
9
- expect(adfToMarkdown({})).toBe('');
10
- expect(adfToMarkdown('plain string')).toBe('');
11
- });
12
- it('단일 paragraph → text', () => {
13
- expect(adfToMarkdown(doc(p('hello')))).toBe('hello');
14
- });
15
- it('여러 paragraph → 빈 줄로 구분', () => {
16
- expect(adfToMarkdown(doc(p('a'), p('b')))).toBe('a\n\nb');
17
- });
18
- it('빈 content paragraph는 무시', () => {
19
- expect(adfToMarkdown(doc({ type: 'paragraph', content: [] }))).toBe('');
20
- expect(adfToMarkdown(doc(p('a'), { type: 'paragraph', content: [] }, p('b')))).toBe('a\n\nb');
21
- });
22
- it('heading → # level', () => {
23
- const h2 = { type: 'heading', attrs: { level: 2 }, content: [{ type: 'text', text: 'Title' }] };
24
- expect(adfToMarkdown(doc(h2))).toBe('## Title');
25
- });
26
- it('bulletList → - items (줄바꿈)', () => {
27
- const list = {
28
- type: 'bulletList',
29
- content: [
30
- { type: 'listItem', content: [p('one')] },
31
- { type: 'listItem', content: [p('two')] },
32
- ],
33
- };
34
- expect(adfToMarkdown(doc(list))).toBe('- one\n- two');
35
- });
36
- it('orderedList → 1. items', () => {
37
- const list = { type: 'orderedList', content: [{ type: 'listItem', content: [p('a')] }] };
38
- expect(adfToMarkdown(doc(list))).toBe('1. a');
39
- });
40
- it('text marks: strong/em/code/strike', () => {
41
- const strong = { type: 'text', text: 'b', marks: [{ type: 'strong' }] };
42
- const em = { type: 'text', text: 'i', marks: [{ type: 'em' }] };
43
- const code = { type: 'text', text: 'c', marks: [{ type: 'code' }] };
44
- expect(adfToMarkdown(doc({ type: 'paragraph', content: [strong] }))).toBe('**b**');
45
- expect(adfToMarkdown(doc({ type: 'paragraph', content: [em] }))).toBe('*i*');
46
- expect(adfToMarkdown(doc({ type: 'paragraph', content: [code] }))).toBe('`c`');
47
- });
48
- it('hardBreak → 줄바꿈', () => {
49
- const para = {
50
- type: 'paragraph',
51
- content: [{ type: 'text', text: 'a' }, { type: 'hardBreak' }, { type: 'text', text: 'b' }],
52
- };
53
- expect(adfToMarkdown(doc(para))).toBe('a\nb');
54
- });
55
- it('codeBlock → 펜스', () => {
56
- const cb = { type: 'codeBlock', content: [{ type: 'text', text: 'const x = 1;' }] };
57
- expect(adfToMarkdown(doc(cb))).toBe('```\nconst x = 1;\n```');
58
- });
59
- it('혼합: paragraph + heading + list', () => {
60
- const result = adfToMarkdown(doc(p('intro'), { type: 'heading', attrs: { level: 3 }, content: [{ type: 'text', text: 'Sub' }] }, { type: 'bulletList', content: [{ type: 'listItem', content: [p('item')] }] }));
61
- expect(result).toBe('intro\n\n### Sub\n\n- item');
62
- });
63
- it('textToAdf와 왕복 (단일 줄)', () => {
64
- // textToAdf로 만든 ADF를 다시 markdown으로 (구조 보존)
65
- expect(adfToMarkdown(textToAdf('한 줄'))).toBe('한 줄');
66
- });
67
- });
68
- //# sourceMappingURL=adf.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adf.test.js","sourceRoot":"","sources":["../../src/__tests__/adf.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,39 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { ANNEX_II_TEMPLATE, matchSection, checkCompleteness } from '../tools/annex-ii-template.js';
3
- describe('annex-ii-template', () => {
4
- it('has 9 sections covering all Annex II requirements', () => {
5
- expect(ANNEX_II_TEMPLATE.sections).toHaveLength(9);
6
- });
7
- it('all required sections have match keywords', () => {
8
- const required = ANNEX_II_TEMPLATE.sections.filter(s => s.required);
9
- for (const section of required) {
10
- expect(section.matchKeywords.length).toBeGreaterThan(0);
11
- }
12
- });
13
- it('matchSection finds correct section by summary', () => {
14
- const risk = matchSection('[Risk Management Report]');
15
- expect(risk?.id).toBe('risk-management');
16
- const iu = matchSection('[Intended Use] Document');
17
- expect(iu?.id).toBe('device-description');
18
- const arch = matchSection('[SW Architecture Document]');
19
- expect(arch?.id).toBe('design-manufacturing');
20
- });
21
- it('checkCompleteness reports missing required sections', () => {
22
- const result = checkCompleteness(ANNEX_II_TEMPLATE.sections, []);
23
- const missing = result.filter(r => r.status === 'missing');
24
- expect(missing.length).toBeGreaterThan(0);
25
- });
26
- it('checkCompleteness reports found when ticket exists', () => {
27
- const result = checkCompleteness(ANNEX_II_TEMPLATE.sections, [{ key: 'TEST-1', summary: 'PMS 시판후 감시 계획', status: 'Done', issuetype: 'Document' }]);
28
- const pms = result.find(r => r.section.id === 'pms');
29
- expect(pms?.status).toBe('found');
30
- expect(pms?.tickets).toHaveLength(1);
31
- });
32
- it('checkCompleteness reports incomplete when approval required but not approved', () => {
33
- const result = checkCompleteness(ANNEX_II_TEMPLATE.sections, [{ key: 'TEST-1', summary: '[3. 설계 및 제조 정보]', status: 'In Progress', issuetype: 'Document' }]);
34
- const design = result.find(r => r.section.id === 'design-manufacturing');
35
- expect(design?.status).toBe('incomplete');
36
- expect(design?.issues.length).toBeGreaterThan(0);
37
- });
38
- });
39
- //# sourceMappingURL=annex-ii-template.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"annex-ii-template.test.js","sourceRoot":"","sources":["../../src/__tests__/annex-ii-template.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,93 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { extractVars, renderTemplate, TEMPLATE_PATHS, TEMPLATE_NAMES, TEMPLATE_VERSION } from '../utils/doc-render.js';
3
- const ticket = {
4
- key: 'ER-123',
5
- issuetype: 'Story',
6
- projectName: 'Jira MCP',
7
- reporter: '홍길동',
8
- };
9
- const baseInput = (template, overrides = {}) => ({
10
- template,
11
- ticket,
12
- date: '2026-07-02',
13
- ...overrides,
14
- });
15
- describe('extractVars', () => {
16
- it('extracts all {VAR} names deduplicated', () => {
17
- const tpl = '# {PROJECT_NAME}\n{US1_TITLE} {US1_TITLE}\n{TICKET_ID}';
18
- expect(extractVars(tpl).sort()).toEqual(['PROJECT_NAME', 'TICKET_ID', 'US1_TITLE']);
19
- });
20
- it('returns empty array when no vars', () => {
21
- expect(extractVars('# plain markdown')).toEqual([]);
22
- });
23
- it('ignores lowercase or non-brace tokens', () => {
24
- expect(extractVars('{PROJECT_NAME} {lowercase} {{double}}')).toEqual(['PROJECT_NAME']);
25
- });
26
- });
27
- describe('renderTemplate', () => {
28
- it('substitutes meta vars deterministically', () => {
29
- const tpl = '# Feature Spec: {PROJECT_NAME}\nTicket: {TICKET_ID} | Date: {DATE}';
30
- const { rendered, unresolved } = renderTemplate(baseInput(tpl));
31
- expect(rendered).toBe('# Feature Spec: Jira MCP\nTicket: ER-123 | Date: 2026-07-02');
32
- expect(unresolved).toEqual([]);
33
- });
34
- it('preserves free-text vars as placeholders', () => {
35
- const tpl = '### {US1_TITLE}\n- {US1_DESCRIPTION}';
36
- const { rendered, unresolved } = renderTemplate(baseInput(tpl));
37
- expect(rendered).toBe('### {US1_TITLE}\n- {US1_DESCRIPTION}');
38
- expect(unresolved.sort()).toEqual(['US1_DESCRIPTION', 'US1_TITLE']);
39
- });
40
- it('substitutes FEATURE_SLUG when provided', () => {
41
- const tpl = 'Branch: {TICKET_ID}-{FEATURE_SLUG}';
42
- const { rendered, unresolved } = renderTemplate(baseInput(tpl, { featureSlug: 'add-login' }));
43
- expect(rendered).toBe('Branch: ER-123-add-login');
44
- expect(unresolved).toEqual([]);
45
- });
46
- it('lists FEATURE_SLUG unresolved when not provided', () => {
47
- const { unresolved } = renderTemplate(baseInput('{FEATURE_SLUG}'));
48
- expect(unresolved).toEqual(['FEATURE_SLUG']);
49
- });
50
- it('lists AUTHOR unresolved when reporter missing', () => {
51
- const { unresolved } = renderTemplate(baseInput('By {AUTHOR}', { ticket: { key: 'ER-1' } }));
52
- expect(unresolved).toEqual(['AUTHOR']);
53
- });
54
- it('mixed: substitutes meta, preserves free-text', () => {
55
- const tpl = '# {PROJECT_NAME} ({TICKET_ID})\n- {FR_001_CAPABILITY}\nDate: {DATE}';
56
- const { rendered, unresolved } = renderTemplate(baseInput(tpl));
57
- expect(rendered).toBe('# Jira MCP (ER-123)\n- {FR_001_CAPABILITY}\nDate: 2026-07-02');
58
- expect(unresolved).toEqual(['FR_001_CAPABILITY']);
59
- });
60
- });
61
- describe('TEMPLATE_PATHS', () => {
62
- it('covers dev_docs + intended_use', () => {
63
- expect(TEMPLATE_NAMES.sort()).toEqual(['intended_use', 'plan', 'prd', 'spec', 'tasks']);
64
- });
65
- it('every entry has path + valid mode + domain', () => {
66
- for (const entry of Object.values(TEMPLATE_PATHS)) {
67
- expect(entry.path).toBeTruthy();
68
- expect(['freeform', 'table-map']).toContain(entry.mode);
69
- expect(['dev', 'mdr']).toContain(entry.domain);
70
- }
71
- });
72
- it('intended_use → mdr_docs/PA, freeform, mdr/PA', () => {
73
- expect(TEMPLATE_PATHS.intended_use).toEqual({
74
- path: 'mdr_docs/PA/intended-use.md',
75
- mode: 'freeform',
76
- domain: 'mdr',
77
- gate: 'PA',
78
- });
79
- });
80
- it('dev_docs entries → dev_docs/ paths, freeform, domain dev (no gate)', () => {
81
- expect(TEMPLATE_PATHS.prd).toEqual({ path: 'dev_docs/prd_template.md', mode: 'freeform', domain: 'dev' });
82
- expect(TEMPLATE_PATHS.spec).toEqual({ path: 'dev_docs/spec_template.md', mode: 'freeform', domain: 'dev' });
83
- expect(TEMPLATE_PATHS.plan).toEqual({ path: 'dev_docs/plan_template.md', mode: 'freeform', domain: 'dev' });
84
- expect(TEMPLATE_PATHS.tasks).toEqual({ path: 'dev_docs/tasks_template.md', mode: 'freeform', domain: 'dev' });
85
- });
86
- });
87
- describe('TEMPLATE_VERSION', () => {
88
- it('is the submodule pin short hash', () => {
89
- expect(TEMPLATE_VERSION).toMatch(/^[0-9a-f]{7,8}$/);
90
- expect(TEMPLATE_VERSION).toBe('4dc0c46');
91
- });
92
- });
93
- //# sourceMappingURL=doc-render.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doc-render.test.js","sourceRoot":"","sources":["../../src/__tests__/doc-render.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,31 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { TOOL_CATALOG, WORKFLOWS } from '../tools/help-data.js';
3
- describe('help-data', () => {
4
- it('has at least 42 tools in catalog', () => {
5
- expect(TOOL_CATALOG.length).toBeGreaterThanOrEqual(42);
6
- });
7
- it('all tools have name, description, category', () => {
8
- for (const tool of TOOL_CATALOG) {
9
- expect(tool.name).toBeTruthy();
10
- expect(tool.description).toBeTruthy();
11
- expect(tool.category).toBeTruthy();
12
- }
13
- });
14
- it('has workflow guides for pa, ea, risk, usability, mdr', () => {
15
- expect(WORKFLOWS.pa).toContain('PA Gate');
16
- expect(WORKFLOWS.ea).toContain('EA Gate');
17
- expect(WORKFLOWS.risk).toContain('리스크 관리');
18
- expect(WORKFLOWS.usability).toContain('IEC 62366');
19
- expect(WORKFLOWS.mdr).toContain('Annex II');
20
- });
21
- it('has customfield workflow with schema-first guidance', () => {
22
- expect(WORKFLOWS.customfield).toContain('inferredFormat');
23
- expect(WORKFLOWS.customfield).toContain('rich_text_custom_fields');
24
- expect(WORKFLOWS.customfield).toContain('jira_get_issue_type_schema');
25
- });
26
- it('tool names are unique', () => {
27
- const names = TOOL_CATALOG.map(t => t.name);
28
- expect(new Set(names).size).toBe(names.length);
29
- });
30
- });
31
- //# sourceMappingURL=help.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"help.test.js","sourceRoot":"","sources":["../../src/__tests__/help.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEhE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,EAAE,CAAC;QACrC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACnE,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,81 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { inferFieldFormat, inferAdfFields, applyAdfToFields, } from '../utils/jira-fields.js';
3
- describe('inferFieldFormat', () => {
4
- it('doc type → adf', () => {
5
- expect(inferFieldFormat('doc')).toBe('adf');
6
- });
7
- it('string + textarea custom → adf-suspect (createmeta 거짓 보고 케이스)', () => {
8
- expect(inferFieldFormat('string', 'com.atlassian.jira.plugin.system.customfieldtypes:textarea')).toBe('adf-suspect');
9
- });
10
- it('plain string without textarea → string', () => {
11
- expect(inferFieldFormat('string')).toBe('string');
12
- expect(inferFieldFormat('string', 'com.atlassian.jira.plugin.system.customfieldtypes:textfield')).toBe('string');
13
- });
14
- it('option type → option', () => {
15
- expect(inferFieldFormat('option')).toBe('option');
16
- });
17
- it('array option type → option (when has allowedValues)', () => {
18
- expect(inferFieldFormat('array', undefined, true)).toBe('option');
19
- });
20
- it('number/date/etc → type 그대로', () => {
21
- expect(inferFieldFormat('number')).toBe('number');
22
- expect(inferFieldFormat('date')).toBe('date');
23
- });
24
- });
25
- describe('inferAdfFields', () => {
26
- const schema = [
27
- { key: 'customfield_10103', type: 'string', custom: 'com.atlassian.jira.plugin.system.customfieldtypes:textarea', inferredFormat: 'adf-suspect' },
28
- { key: 'customfield_10104', type: 'doc', inferredFormat: 'adf' },
29
- { key: 'customfield_10301', type: 'string', inferredFormat: 'string' },
30
- { key: 'customfield_10382', type: 'option', allowedValues: [], inferredFormat: 'option' },
31
- { key: 'summary', type: 'string', inferredFormat: 'string' },
32
- ];
33
- it('adf + adf-suspect 필드를 모두 추정', () => {
34
- expect(inferAdfFields(schema).sort()).toEqual(['customfield_10103', 'customfield_10104']);
35
- });
36
- it('명시 키 병합 + 중복 제거', () => {
37
- const result = inferAdfFields(schema, ['customfield_10301', 'customfield_10104']).sort();
38
- expect(result).toEqual(['customfield_10103', 'customfield_10104', 'customfield_10301']);
39
- });
40
- it('schema 없이 명시 키만으로도 동작', () => {
41
- expect(inferAdfFields([], ['customfield_10103']).sort()).toEqual(['customfield_10103']);
42
- });
43
- it('빈 입력 → 빈 배열', () => {
44
- expect(inferAdfFields([])).toEqual([]);
45
- expect(inferAdfFields([], [])).toEqual([]);
46
- });
47
- });
48
- describe('applyAdfToFields', () => {
49
- it('지정 키의 string을 ADF로 변환', () => {
50
- const result = applyAdfToFields({ customfield_10103: '테스트 본문', summary: '제목' }, ['customfield_10103']);
51
- expect(result.summary).toBe('제목'); // 비대상 그대로
52
- expect(result.customfield_10103).toMatchObject({
53
- type: 'doc',
54
- version: 1,
55
- content: [{ type: 'paragraph', content: [{ type: 'text', text: '테스트 본문' }] }],
56
- });
57
- });
58
- it('이미 ADF 객체인 값은 그대로 (재변환 금지)', () => {
59
- const adf = { type: 'doc', version: 1, content: [{ type: 'paragraph', content: [] }] };
60
- const result = applyAdfToFields({ customfield_10103: adf }, ['customfield_10103']);
61
- expect(result.customfield_10103).toBe(adf);
62
- });
63
- it('여러 줄 문자열 → 여러 paragraph', () => {
64
- const result = applyAdfToFields({ customfield_10104: '첫째 줄\n둘째 줄' }, ['customfield_10104']);
65
- expect(result.customfield_10104.content).toHaveLength(2);
66
- });
67
- it('존재하지 않는 키는 무시', () => {
68
- const result = applyAdfToFields({ summary: '제목' }, ['customfield_99999']);
69
- expect(result).toEqual({ summary: '제목' });
70
- });
71
- it('빈 adfKeys → 원본 그대로', () => {
72
- const original = { summary: '제목', customfield_10103: '본문' };
73
- expect(applyAdfToFields(original, [])).toEqual(original);
74
- });
75
- it('원본을 변이시키지 않음 (순수)', () => {
76
- const original = { customfield_10103: '본문' };
77
- applyAdfToFields(original, ['customfield_10103']);
78
- expect(original.customfield_10103).toBe('본문'); // 원본 유지
79
- });
80
- });
81
- //# sourceMappingURL=jira-fields.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"jira-fields.test.js","sourceRoot":"","sources":["../../src/__tests__/jira-fields.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,91 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { readFileSync, existsSync } from 'node:fs';
3
- import { fileURLToPath } from 'node:url';
4
- import path from 'node:path';
5
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
- const root = path.resolve(__dirname, '../..');
7
- const readJson = (p) => JSON.parse(readFileSync(path.join(root, p), 'utf8'));
8
- describe('plugin manifest 정합성', () => {
9
- it('plugin name = neobiotech-dev-agent', () => {
10
- const plugin = readJson('.claude-plugin/plugin.json');
11
- expect(plugin.name).toBe('neobiotech-dev-agent');
12
- });
13
- it('marketplace(prod) name = neobiotech', () => {
14
- const market = readJson('.claude-plugin/marketplace.json');
15
- expect(market.name).toBe('neobiotech');
16
- });
17
- it('plugin.json name === marketplace.json plugin entry name', () => {
18
- const plugin = readJson('.claude-plugin/plugin.json');
19
- const market = readJson('.claude-plugin/marketplace.json');
20
- const entry = market.plugins.find((p) => p.name === plugin.name);
21
- expect(entry).toBeDefined();
22
- });
23
- it('marketplace(prod) source = npm @neobiotechlabs/neobiotech-dev-agent', () => {
24
- const market = readJson('.claude-plugin/marketplace.json');
25
- const entry = market.plugins[0];
26
- expect(entry.source.source).toBe('npm');
27
- expect(entry.source.package).toBe('@neobiotechlabs/neobiotech-dev-agent');
28
- expect(entry.source.registry).toBe('https://registry.npmjs.org');
29
- expect(entry.source.version).toMatch(/^\d+\.\d+\.\d+(-[\w.]+)?$/);
30
- });
31
- it('marketplace.json is the only marketplace manifest (no dev file)', () => {
32
- expect(existsSync(path.join(root, '.claude-plugin/marketplace.json'))).toBe(true);
33
- expect(existsSync(path.join(root, '.claude-plugin/marketplace.dev.json'))).toBe(false);
34
- });
35
- it('plugin.json version === package.json version', () => {
36
- const plugin = readJson('.claude-plugin/plugin.json');
37
- const pkg = readJson('package.json');
38
- expect(plugin.version).toBe(pkg.version);
39
- });
40
- it('marketplace(prod) source.version === package.json version', () => {
41
- const market = readJson('.claude-plugin/marketplace.json');
42
- const pkg = readJson('package.json');
43
- expect(market.plugins[0].source.version).toBe(pkg.version);
44
- });
45
- it('.mcp.json uses plugin format (서버 이름 최상위, mcpServers 래퍼 없음)', () => {
46
- // 공식 plugin(context7, github) 정합을 위해 서버 이름을 최상위에 둔다.
47
- // (MCP -32000 원인은 포맷이 아니라 userConfig 미구성 → 빈 env → index.ts exit(1).
48
- // userConfig 입력 + Claude Code 완전 재시작으로 해결. mcpServers 래퍼 유무와 무관.)
49
- const mcp = readJson('.mcp.json');
50
- expect(mcp.mcpServers).toBeUndefined();
51
- expect(mcp['neobiotech-dev-agent']).toBeDefined();
52
- });
53
- it('.mcp.json command = node ${CLAUDE_PLUGIN_ROOT}/dist/index.js', () => {
54
- const mcp = readJson('.mcp.json');
55
- const server = mcp['neobiotech-dev-agent'];
56
- expect(server.command).toBe('node');
57
- expect(server.args[0]).toBe('${CLAUDE_PLUGIN_ROOT}/dist/index.js');
58
- });
59
- it('.mcp.json env maps all user_config keys', () => {
60
- const mcp = readJson('.mcp.json');
61
- const env = mcp['neobiotech-dev-agent'].env;
62
- expect(env.JIRA_URL).toBe('${user_config.JIRA_URL}');
63
- expect(env.JIRA_EMAIL).toBe('${user_config.JIRA_EMAIL}');
64
- expect(env.JIRA_API_TOKEN).toBe('${user_config.JIRA_API_TOKEN}');
65
- expect(env.XRAY_CLIENT_ID).toBe('${user_config.XRAY_CLIENT_ID}');
66
- expect(env.XRAY_CLIENT_SECRET).toBe('${user_config.XRAY_CLIENT_SECRET}');
67
- expect(env.RISK_PLUGIN_AUTH_TOKEN).toBe('${user_config.RISK_PLUGIN_AUTH_TOKEN}');
68
- });
69
- it('userConfig declares required JIRA keys + sensitive tokens', () => {
70
- const plugin = readJson('.claude-plugin/plugin.json');
71
- expect(plugin.userConfig.JIRA_URL.required).toBe(true);
72
- expect(plugin.userConfig.JIRA_EMAIL.required).toBe(true);
73
- expect(plugin.userConfig.JIRA_API_TOKEN.required).toBe(true);
74
- expect(plugin.userConfig.JIRA_API_TOKEN.sensitive).toBe(true);
75
- expect(plugin.userConfig.XRAY_CLIENT_ID.required).toBe(false);
76
- expect(plugin.userConfig.XRAY_CLIENT_SECRET.sensitive).toBe(true);
77
- expect(plugin.userConfig.RISK_PLUGIN_AUTH_TOKEN.required).toBe(false);
78
- });
79
- it('skill moved to skills/doc-render/SKILL.md', () => {
80
- expect(existsSync(path.join(root, 'skills/doc-render/SKILL.md'))).toBe(true);
81
- const body = readFileSync(path.join(root, 'skills/doc-render/SKILL.md'), 'utf8');
82
- expect(body).toContain('doc_render');
83
- });
84
- it('package.json files includes plugin artifacts', () => {
85
- const pkg = readJson('package.json');
86
- expect(pkg.files).toContain('.claude-plugin');
87
- expect(pkg.files).toContain('skills');
88
- expect(pkg.files).toContain('.mcp.json');
89
- });
90
- });
91
- //# sourceMappingURL=plugin-manifest.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-manifest.test.js","sourceRoot":"","sources":["../../src/__tests__/plugin-manifest.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,7 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- describe('test setup', () => {
3
- it('works', () => {
4
- expect(1 + 1).toBe(2);
5
- });
6
- });
7
- //# sourceMappingURL=setup.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.test.js","sourceRoot":"","sources":["../../src/__tests__/setup.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QACf,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,37 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { injectPluginVersion, injectMarketplaceVersion } from '../utils/sync-version.js';
3
- describe('sync-version', () => {
4
- it('injectPluginVersion sets top-level version', () => {
5
- const input = JSON.stringify({ name: 'x', version: '0.0.0' });
6
- const out = injectPluginVersion(input, '0.1.4');
7
- expect(JSON.parse(out).version).toBe('0.1.4');
8
- });
9
- it('injectPluginVersion preserves other fields + 2-space indent', () => {
10
- const input = JSON.stringify({ name: 'x', version: '0.0.0', userConfig: { A: 1 } });
11
- const out = injectPluginVersion(input, '0.1.4');
12
- const parsed = JSON.parse(out);
13
- expect(parsed.name).toBe('x');
14
- expect(parsed.userConfig.A).toBe(1);
15
- expect(out).toContain(' "name": "x"');
16
- expect(out.endsWith('\n')).toBe(true);
17
- });
18
- it('injectMarketplaceVersion sets plugins[0].source.version', () => {
19
- const input = JSON.stringify({
20
- name: 'neobiotech',
21
- plugins: [{ name: 'p', source: { package: 'pkg', version: '0.0.0' } }],
22
- });
23
- const out = injectMarketplaceVersion(input, '0.1.4');
24
- expect(JSON.parse(out).plugins[0].source.version).toBe('0.1.4');
25
- });
26
- it('injectMarketplaceVersion preserves marketplace name + plugin name', () => {
27
- const input = JSON.stringify({
28
- name: 'neobiotech',
29
- plugins: [{ name: 'neobiotech-dev-agent', source: { package: 'pkg', version: '0.0.0' } }],
30
- });
31
- const out = injectMarketplaceVersion(input, '0.1.4');
32
- const parsed = JSON.parse(out);
33
- expect(parsed.name).toBe('neobiotech');
34
- expect(parsed.plugins[0].name).toBe('neobiotech-dev-agent');
35
- });
36
- });
37
- //# sourceMappingURL=sync-version.test.js.map