@neobiotechlabs/neobiotech-dev-agent 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/.claude-plugin/marketplace.json +22 -0
  2. package/.claude-plugin/plugin.json +58 -0
  3. package/.mcp.json +14 -0
  4. package/README.md +442 -0
  5. package/dist/__tests__/adf.test.d.ts +1 -0
  6. package/dist/__tests__/adf.test.js +68 -0
  7. package/dist/__tests__/adf.test.js.map +1 -0
  8. package/dist/__tests__/annex-ii-template.test.d.ts +1 -0
  9. package/dist/__tests__/annex-ii-template.test.js +39 -0
  10. package/dist/__tests__/annex-ii-template.test.js.map +1 -0
  11. package/dist/__tests__/doc-render.test.d.ts +1 -0
  12. package/dist/__tests__/doc-render.test.js +93 -0
  13. package/dist/__tests__/doc-render.test.js.map +1 -0
  14. package/dist/__tests__/help.test.d.ts +1 -0
  15. package/dist/__tests__/help.test.js +31 -0
  16. package/dist/__tests__/help.test.js.map +1 -0
  17. package/dist/__tests__/jira-fields.test.d.ts +1 -0
  18. package/dist/__tests__/jira-fields.test.js +81 -0
  19. package/dist/__tests__/jira-fields.test.js.map +1 -0
  20. package/dist/__tests__/plugin-manifest.test.d.ts +1 -0
  21. package/dist/__tests__/plugin-manifest.test.js +91 -0
  22. package/dist/__tests__/plugin-manifest.test.js.map +1 -0
  23. package/dist/__tests__/setup.test.d.ts +1 -0
  24. package/dist/__tests__/setup.test.js +7 -0
  25. package/dist/__tests__/setup.test.js.map +1 -0
  26. package/dist/__tests__/sync-version.test.d.ts +1 -0
  27. package/dist/__tests__/sync-version.test.js +37 -0
  28. package/dist/__tests__/sync-version.test.js.map +1 -0
  29. package/dist/clients/risk-client.d.ts +17 -0
  30. package/dist/clients/risk-client.js +54 -0
  31. package/dist/clients/risk-client.js.map +1 -0
  32. package/dist/clients/xray-client.d.ts +34 -0
  33. package/dist/clients/xray-client.js +127 -0
  34. package/dist/clients/xray-client.js.map +1 -0
  35. package/dist/config/project-config.d.ts +14 -0
  36. package/dist/config/project-config.js +45 -0
  37. package/dist/config/project-config.js.map +1 -0
  38. package/dist/confluence-client.d.ts +16 -0
  39. package/dist/confluence-client.js +97 -0
  40. package/dist/confluence-client.js.map +1 -0
  41. package/dist/index.d.ts +2 -0
  42. package/dist/index.js +60 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/jira-client.d.ts +35 -0
  45. package/dist/jira-client.js +119 -0
  46. package/dist/jira-client.js.map +1 -0
  47. package/dist/tools/annex-ii-template.d.ts +30 -0
  48. package/dist/tools/annex-ii-template.js +129 -0
  49. package/dist/tools/annex-ii-template.js.map +1 -0
  50. package/dist/tools/confluence.d.ts +2 -0
  51. package/dist/tools/confluence.js +54 -0
  52. package/dist/tools/confluence.js.map +1 -0
  53. package/dist/tools/cvss.d.ts +2 -0
  54. package/dist/tools/cvss.js +59 -0
  55. package/dist/tools/cvss.js.map +1 -0
  56. package/dist/tools/doc-render.d.ts +2 -0
  57. package/dist/tools/doc-render.js +96 -0
  58. package/dist/tools/doc-render.js.map +1 -0
  59. package/dist/tools/doc-validation.d.ts +2 -0
  60. package/dist/tools/doc-validation.js +221 -0
  61. package/dist/tools/doc-validation.js.map +1 -0
  62. package/dist/tools/help-data.d.ts +7 -0
  63. package/dist/tools/help-data.js +144 -0
  64. package/dist/tools/help-data.js.map +1 -0
  65. package/dist/tools/help.d.ts +2 -0
  66. package/dist/tools/help.js +39 -0
  67. package/dist/tools/help.js.map +1 -0
  68. package/dist/tools/iec.d.ts +2 -0
  69. package/dist/tools/iec.js +203 -0
  70. package/dist/tools/iec.js.map +1 -0
  71. package/dist/tools/init.d.ts +2 -0
  72. package/dist/tools/init.js +38 -0
  73. package/dist/tools/init.js.map +1 -0
  74. package/dist/tools/jira-crud.d.ts +2 -0
  75. package/dist/tools/jira-crud.js +142 -0
  76. package/dist/tools/jira-crud.js.map +1 -0
  77. package/dist/tools/risk.d.ts +2 -0
  78. package/dist/tools/risk.js +172 -0
  79. package/dist/tools/risk.js.map +1 -0
  80. package/dist/tools/traceability.d.ts +2 -0
  81. package/dist/tools/traceability.js +85 -0
  82. package/dist/tools/traceability.js.map +1 -0
  83. package/dist/tools/types.d.ts +13 -0
  84. package/dist/tools/types.js +2 -0
  85. package/dist/tools/types.js.map +1 -0
  86. package/dist/tools/usability.d.ts +2 -0
  87. package/dist/tools/usability.js +149 -0
  88. package/dist/tools/usability.js.map +1 -0
  89. package/dist/tools/xray.d.ts +2 -0
  90. package/dist/tools/xray.js +35 -0
  91. package/dist/tools/xray.js.map +1 -0
  92. package/dist/utils/adf.d.ts +27 -0
  93. package/dist/utils/adf.js +104 -0
  94. package/dist/utils/adf.js.map +1 -0
  95. package/dist/utils/cvss.d.ts +15 -0
  96. package/dist/utils/cvss.js +86 -0
  97. package/dist/utils/cvss.js.map +1 -0
  98. package/dist/utils/doc-render.d.ts +28 -0
  99. package/dist/utils/doc-render.js +50 -0
  100. package/dist/utils/doc-render.js.map +1 -0
  101. package/dist/utils/jira-fields.d.ts +38 -0
  102. package/dist/utils/jira-fields.js +53 -0
  103. package/dist/utils/jira-fields.js.map +1 -0
  104. package/dist/utils/sync-version.d.ts +2 -0
  105. package/dist/utils/sync-version.js +20 -0
  106. package/dist/utils/sync-version.js.map +1 -0
  107. package/package.json +49 -0
  108. package/skills/doc-render/SKILL.md +79 -0
  109. package/vendor/dev-docs-templates/templates/dev_docs/plan_template.md +104 -0
  110. package/vendor/dev-docs-templates/templates/dev_docs/prd_template.md +110 -0
  111. package/vendor/dev-docs-templates/templates/dev_docs/spec_template.md +81 -0
  112. package/vendor/dev-docs-templates/templates/dev_docs/tasks_template.md +122 -0
  113. package/vendor/dev-docs-templates/templates/mdr_docs/CA/checklist-clinical-evaluation.md +81 -0
  114. package/vendor/dev-docs-templates/templates/mdr_docs/CA/checklist-gspr-mdr.md +403 -0
  115. package/vendor/dev-docs-templates/templates/mdr_docs/CA/clinical-evaluation-report.md +492 -0
  116. package/vendor/dev-docs-templates/templates/mdr_docs/CA/instructions-for-use.md +132 -0
  117. package/vendor/dev-docs-templates/templates/mdr_docs/CA/literature-evaluation-table.md +15 -0
  118. package/vendor/dev-docs-templates/templates/mdr_docs/CA/mdr-declaration-of-conformity.md +75 -0
  119. package/vendor/dev-docs-templates/templates/mdr_docs/CA/post-market-clinical-follow-up-plan.md +162 -0
  120. package/vendor/dev-docs-templates/templates/mdr_docs/CA/post-market-surveillance-plan.md +175 -0
  121. package/vendor/dev-docs-templates/templates/mdr_docs/CA/risk-management-cybersecurity-checklist.md +67 -0
  122. package/vendor/dev-docs-templates/templates/mdr_docs/CA/risk-management-report.md +111 -0
  123. package/vendor/dev-docs-templates/templates/mdr_docs/CA/usability-evaluation-report.md +70 -0
  124. package/vendor/dev-docs-templates/templates/mdr_docs/EA/clinical-evaluation-plan.md +154 -0
  125. package/vendor/dev-docs-templates/templates/mdr_docs/EA/list-of-hazard-related-use-scenarios.md +34 -0
  126. package/vendor/dev-docs-templates/templates/mdr_docs/EA/risk-table-fmea.md +155 -0
  127. package/vendor/dev-docs-templates/templates/mdr_docs/EA/software-architecture-description.md +307 -0
  128. package/vendor/dev-docs-templates/templates/mdr_docs/EA/software-requirements-list.md +156 -0
  129. package/vendor/dev-docs-templates/templates/mdr_docs/EA/soup-list.md +82 -0
  130. package/vendor/dev-docs-templates/templates/mdr_docs/EA/usability-evaluation-plan.md +103 -0
  131. package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/bug-fixes-documentation-list.md +35 -0
  132. package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/change-evaluation-list.md +100 -0
  133. package/vendor/dev-docs-templates/templates/mdr_docs/ER/global/list-of-known-anomalies.md +29 -0
  134. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/algorithm-validation-report.md +170 -0
  135. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/checklist-software-release.md +52 -0
  136. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/checklist-software-requirements-review.md +50 -0
  137. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-architecture-checklist.md +41 -0
  138. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-detailed-design.md +321 -0
  139. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/software-system-test-plan.md +155 -0
  140. package/vendor/dev-docs-templates/templates/mdr_docs/ER/sprint/usability-evaluation-protocol.md +63 -0
  141. package/vendor/dev-docs-templates/templates/mdr_docs/PA/intended-use.md +116 -0
  142. package/vendor/dev-docs-templates/templates/mdr_docs/PA/mdr-classification-document.md +114 -0
  143. package/vendor/dev-docs-templates/templates/mdr_docs/PA/risk-management-plan.md +198 -0
  144. package/vendor/dev-docs-templates/templates/mdr_docs/PA/software-development-maintenance-plan.md +225 -0
  145. package/vendor/dev-docs-templates/templates/mdr_docs/PA/system-requirements-spec.md +182 -0
  146. package/vendor/dev-docs-templates/templates/mdr_docs/global/information_security/information-security-controls.md +966 -0
  147. package/vendor/dev-docs-templates/templates/mdr_docs/global/information_security/information-security-policy-and-scope.md +99 -0
  148. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/quality-manual-policy-objectives.md +187 -0
  149. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-capa.md +112 -0
  150. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-change-management.md +128 -0
  151. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-clinical-evaluation.md +102 -0
  152. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-feedback-management.md +140 -0
  153. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-integrated-software-development.md +361 -0
  154. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-post-market-surveillance.md +159 -0
  155. package/vendor/dev-docs-templates/templates/mdr_docs/global/qms/sop-software-problem-resolution.md +99 -0
@@ -0,0 +1,7 @@
1
+ export interface ToolInfo {
2
+ name: string;
3
+ description: string;
4
+ category: string;
5
+ }
6
+ export declare const TOOL_CATALOG: ToolInfo[];
7
+ export declare const WORKFLOWS: Record<string, string>;
@@ -0,0 +1,144 @@
1
+ export const TOOL_CATALOG = [
2
+ { name: 'jira_get_issue', description: '이슈 조회', category: 'Jira 기본' },
3
+ { name: 'jira_search', description: 'JQL 검색', category: 'Jira 기본' },
4
+ { name: 'jira_create_issue', description: '이슈 생성 (rich_text customfield ADF 자동 변환 지원)', category: 'Jira 기본' },
5
+ { name: 'jira_update_issue', description: '이슈 업데이트 (description + rich_text customfield ADF 자동 변환 지원)', category: 'Jira 기본' },
6
+ { name: 'jira_add_comment', description: '코멘트 추가', category: 'Jira 기본' },
7
+ { name: 'jira_create_link', description: '이슈 링크 생성 (Blocks, Implements, Relates, Risk Source, Mitigates)', category: 'Jira 기본' },
8
+ { name: 'jira_get_links', description: '이슈 링크 조회', category: 'Jira 기본' },
9
+ { name: 'jira_delete_link', description: '이슈 링크 삭제', category: 'Jira 기본' },
10
+ { name: 'jira_get_transitions', description: '상태 전환 조회', category: 'Jira 기본' },
11
+ { name: 'jira_transition', description: '이슈 상태 전환', category: 'Jira 기본' },
12
+ { name: 'jira_delete_issue', description: '이슈 삭제', category: 'Jira 기본' },
13
+ { name: 'jira_get_issue_type_schema', description: '이슈 타입 필드 스키마 조회', category: 'Jira 기본' },
14
+ { name: 'confluence_get_page', description: 'Confluence 페이지 조회', category: 'Confluence' },
15
+ { name: 'confluence_search', description: 'CQL 검색', category: 'Confluence' },
16
+ { name: 'confluence_create_page', description: '페이지 생성', category: 'Confluence' },
17
+ { name: 'confluence_update_page', description: '페이지 수정', category: 'Confluence' },
18
+ { name: 'confluence_delete_page', description: '페이지 삭제', category: 'Confluence' },
19
+ { name: 'confluence_get_spaces', description: '스페이스 목록', category: 'Confluence' },
20
+ { name: 'confluence_get_page_children', description: '하위 페이지 조회', category: 'Confluence' },
21
+ { name: 'risk_get_config', description: '리스크 관리 설정 조회', category: '리스크 관리' },
22
+ { name: 'risk_activate_panel', description: '리스크 패널 활성화', category: '리스크 관리' },
23
+ { name: 'risk_set_values', description: '리스크 값(severity, p1, p2) 설정', category: '리스크 관리' },
24
+ { name: 'risk_create_hazards', description: 'Hazard 일괄 생성 + Risk Source 링크', category: '리스크 관리' },
25
+ { name: 'risk_create_mitigation', description: '완화 Requirement 생성 + P2 업데이트', category: '리스크 관리' },
26
+ { name: 'cvss_calculate', description: 'CVSS v4.0 점수 계산', category: '보안 취약점' },
27
+ { name: 'cvss_set_vector', description: 'Vulnerability 티켓에 CVSS Vector 설정', category: '보안 취약점' },
28
+ { name: 'cvss_get_vector', description: 'Vulnerability 티켓의 CVSS Vector 조회', category: '보안 취약점' },
29
+ { name: 'xray_get_test_keys', description: 'Test Execution의 Test 키 목록', category: '테스트 (Xray)' },
30
+ { name: 'xray_export_cucumber', description: 'Cucumber feature 파일 export', category: '테스트 (Xray)' },
31
+ { name: 'xray_import_results', description: '테스트 실행 결과 import', category: '테스트 (Xray)' },
32
+ { name: 'xray_create_test', description: 'Xray 테스트 케이스 생성', category: '테스트 (Xray)' },
33
+ { name: 'traceability_check', description: '티켓 추적성 상태 확인', category: '추적성' },
34
+ { name: 'traceability_find_missing', description: 'Gate 내 누락 링크 찾기', category: '추적성' },
35
+ { name: 'traceability_fix', description: '누락 링크 자동 생성', category: '추적성' },
36
+ { name: 'iec_create_gate', description: 'PA/EA Gate + Document 티켓 생성', category: 'IEC 62304' },
37
+ { name: 'iec_get_next_steps', description: '티켓 기준 다음 단계 안내', category: 'IEC 62304' },
38
+ { name: 'sds_create_task', description: 'Task 생성 + SDS/DD 링크', category: 'IEC 62304' },
39
+ { name: 'doc_update_description', description: '문서 내용을 Jira description으로 업데이트', category: 'IEC 62304' },
40
+ { name: 'usability_create_use_spec', description: 'Use Specification 정의 (IEC 62366-1)', category: '사용성 공학' },
41
+ { name: 'usability_create_scenarios', description: '사용 시나리오(Normal/Abnormal) 일괄 생성', category: '사용성 공학' },
42
+ { name: 'usability_link_to_hazard', description: '시나리오 → Hazard Risk Source 연결', category: '사용성 공학' },
43
+ { name: 'usability_create_validation', description: '사용성 검증 결과 기록', category: '사용성 공학' },
44
+ { name: 'doc_create_from_template', description: 'MDR Annex II 구조로 문서 티켓 생성', category: '기술 문서 검증' },
45
+ { name: 'doc_check_completeness', description: 'MDR Annex II 문서 완전성 검사', category: '기술 문서 검증' },
46
+ { name: 'doc_generate_evidence', description: 'NB 심사용 증거 패키지 생성', category: '기술 문서 검증' },
47
+ // dev_docs 렌더 (dev-docs-templates submodule 기반)
48
+ { name: 'doc_render', description: 'dev_docs(PRD/Spec/Plan/Tasks)·mdr_docs(intended-use) 템플릿 모드 기반(freeform) 결정적 렌더 — 메타만 치환, 자유 텍스트/지침은 consumer가 채움', category: '개발 문서 렌더' },
49
+ // Init
50
+ { name: 'jira_init_project', description: '프로젝트 폴더에 Jira 프로젝트 키 초기 설정 (CLAUDE.md 업데이트)', category: '초기 설정' },
51
+ { name: 'help', description: '사용 가능한 도구 카탈로그와 워크플로우 가이드 조회 (topic 지정 가능)', category: '도움말' },
52
+ ];
53
+ export const WORKFLOWS = {
54
+ pa: [
55
+ '=== PA Gate 워크플로우 ===',
56
+ '',
57
+ '1. iec_create_gate → PA Gate + 7개 Document 티켓 생성',
58
+ '2. [Intended Use] Document → IU 티켓 생성 (사용자, 환경, 목적 정의)',
59
+ '3. [System Requirement Spec] → SyRS 티켓 생성 (IU 기반 시스템 요구사항)',
60
+ '4. [Classification] → 분류 티켓 (MDR Class 판정)',
61
+ '5. [SW Development Plan] → 개발 계획서 작성',
62
+ '6. [Risk Management Plan] → 리스크 관리 계획서 작성',
63
+ '7. [Security Maintenance Plan] → 보안 유지보수 계획서',
64
+ '8. [Configuration Management Plan] → 형상 관리 계획서',
65
+ '',
66
+ '사용성 공학 (IEC 62366-1)도 PA 단계에서 시작:',
67
+ '9. usability_create_use_spec → Use Specification 정의',
68
+ '10. usability_create_scenarios → Normal/Abnormal 사용 시나리오 식별',
69
+ ].join('\n'),
70
+ ea: [
71
+ '=== EA Gate 워크플로우 ===',
72
+ '',
73
+ '1. iec_create_gate → EA Gate + 4개 Document 티켓 생성',
74
+ '2. [Risk Management Report]',
75
+ ' - risk_create_hazards → Hazard 일괄 생성',
76
+ ' - usability_link_to_hazard → 사용 시나리오 → Hazard 연결',
77
+ '3. [SW Requirements Spec]',
78
+ ' - FR/NFR 정리',
79
+ ' - risk_create_mitigation → 완화 Requirement 생성 + P2 업데이트',
80
+ '4. [SW Architecture Document] → 아키텍처 설계',
81
+ '5. [SW Detailed Design Document] → 상세 설계 + Task 생성',
82
+ '',
83
+ '검증:',
84
+ '6. xray_create_test → 테스트 케이스 생성',
85
+ '7. usability_create_validation → 사용성 검증',
86
+ '8. doc_check_completeness → 기술 문서 완전성 검증',
87
+ '9. doc_generate_evidence → NB 심사용 증거 패키지 생성',
88
+ ].join('\n'),
89
+ risk: [
90
+ '=== 리스크 관리 워크플로우 ===',
91
+ '',
92
+ '1. risk_get_config → 프로젝트 리스크 설정 확인',
93
+ '2. IU/SyRS 분석 → Hazard 식별',
94
+ '3. risk_create_hazards → Hazard 일괄 생성 (Risk 값 + Risk Source 링크 자동)',
95
+ '4. 완화 조치 설계 → risk_create_mitigation → Requirement 생성 (P2 자동 업데이트)',
96
+ '5. traceability_check → 추적성 확인',
97
+ '6. traceability_find_missing → 누락 링크 검색',
98
+ '7. traceability_fix → 누락 링크 자동 생성',
99
+ ].join('\n'),
100
+ usability: [
101
+ '=== 사용성 공학 (IEC 62366-1) 워크플로우 ===',
102
+ '',
103
+ '1. usability_create_use_spec → Use Specification 정의',
104
+ ' (사용자 프로파일, 사용 환경, 의도된 사용)',
105
+ '2. usability_create_scenarios → 사용 시나리오 식별',
106
+ ' - Normal Use: 정상 사용 시나리오',
107
+ ' - Abnormal Use: 비정상 사용 시나리오 (Hazard 원천)',
108
+ '3. usability_link_to_hazard → 시나리오 → Hazard 연결',
109
+ ' (Risk Source 링크로 자동 연결)',
110
+ '4. usability_create_validation → 사용성 검증 결과 기록',
111
+ ' (검증 방법, 결과, 증빙)',
112
+ ].join('\n'),
113
+ mdr: [
114
+ '=== MDR 기술 문서 (Annex II) 워크플로우 ===',
115
+ '',
116
+ '1. doc_create_from_template → Annex II 구조로 문서 티켓 생성',
117
+ '2. 각 섹션별 내용 작성',
118
+ '3. doc_check_completeness → 누락/미승인 항목 검사',
119
+ '4. doc_generate_evidence → 증거 패키지 생성',
120
+ ' - 추적성 매트릭스 (IU → SyRS → Req → DD → Task → Test)',
121
+ ' - 리스크 매트릭스 (Hazard × Severity × P1/P2)',
122
+ ' - V&V 요약 (테스트 통과율)',
123
+ ].join('\n'),
124
+ customfield: [
125
+ '=== customfield / 문서 필드 채우기 워크플로우 ===',
126
+ '',
127
+ '주의: customfield 중 일부는 rich text(ADF)를 요구하지만, createmeta가 string으로',
128
+ '잘못 보고하는 경우가 있다 (빈 티켓 "빈 깡통"의 주원인). 아래 절차로 방지한다.',
129
+ '',
130
+ '1. jira_get_issue_type_schema → 이슈타입 필드 구조 + inferredFormat 확인',
131
+ ' inferredFormat 값: adf(확정) / adf-suspect(string이나 textarea, 의심) /',
132
+ ' option / string / number / date ...',
133
+ '2. ADF 필드(customfield_*) 식별 — inferredFormat이 adf 또는 adf-suspect인 필드',
134
+ '3. jira_create_issue / jira_update_issue 호출 시:',
135
+ ' - 자동 감지: auto_detect_rich_text: true (schema에서 ADF 필드 자동 추정)',
136
+ ' - 명시 지정: rich_text_custom_fields: ["customfield_xxxx", ...] (최종 보수)',
137
+ ' - 평문을 넘기면 자동으로 ADF로 변환됨 (이미 ADF 객체면 그대로)',
138
+ '4. option 필드(예: Phase)는 { value: "PA" } 형태로 extra_fields/fields에 전달',
139
+ '',
140
+ '표준 원칙: 문서 티켓을 만들 때는 반드시 schema를 먼저 보고,',
141
+ 'customfield를 그 구조에 맞춰 채운다 — 빈 티켓을 방치하지 않는다.',
142
+ ].join('\n'),
143
+ };
144
+ //# sourceMappingURL=help-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-data.js","sourceRoot":"","sources":["../../src/tools/help-data.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAe;IACtC,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;IACrE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;IACnE,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,4CAA4C,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC7G,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,4DAA4D,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC7H,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxE,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,gEAAgE,EAAE,QAAQ,EAAE,SAAS,EAAE;IAChI,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxE,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC1E,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC9E,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE;IACzE,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;IACxE,EAAE,IAAI,EAAE,4BAA4B,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE;IAC3F,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,EAAE,YAAY,EAAE;IACzF,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC5E,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IACjF,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IACjF,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE;IACjF,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE;IACjF,EAAE,IAAI,EAAE,8BAA8B,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE;IAC1F,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC5E,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC9E,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC1F,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACjG,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAClG,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC9E,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAChG,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,kCAAkC,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAChG,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,YAAY,EAAE;IAChG,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,4BAA4B,EAAE,QAAQ,EAAE,YAAY,EAAE;IACnG,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,EAAE;IACxF,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE;IACpF,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC5E,EAAE,IAAI,EAAE,2BAA2B,EAAE,WAAW,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE;IACtF,EAAE,IAAI,EAAE,kBAAkB,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;IACzE,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,6BAA6B,EAAE,QAAQ,EAAE,WAAW,EAAE;IAC9F,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,WAAW,EAAE;IACpF,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,qBAAqB,EAAE,QAAQ,EAAE,WAAW,EAAE;IACtF,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,gCAAgC,EAAE,QAAQ,EAAE,WAAW,EAAE;IACxG,EAAE,IAAI,EAAE,2BAA2B,EAAE,WAAW,EAAE,oCAAoC,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC5G,EAAE,IAAI,EAAE,4BAA4B,EAAE,WAAW,EAAE,gCAAgC,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACzG,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,8BAA8B,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrG,EAAE,IAAI,EAAE,6BAA6B,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACxF,EAAE,IAAI,EAAE,0BAA0B,EAAE,WAAW,EAAE,2BAA2B,EAAE,QAAQ,EAAE,UAAU,EAAE;IACpG,EAAE,IAAI,EAAE,wBAAwB,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC/F,EAAE,IAAI,EAAE,uBAAuB,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxF,gDAAgD;IAChD,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,mHAAmH,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC9K,OAAO;IACP,EAAE,IAAI,EAAE,mBAAmB,EAAE,WAAW,EAAE,6CAA6C,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC5G,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,4CAA4C,EAAE,QAAQ,EAAE,KAAK,EAAE;CAC7F,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAA2B;IAC/C,EAAE,EAAE;QACF,uBAAuB;QACvB,EAAE;QACF,kDAAkD;QAClD,wDAAwD;QACxD,4DAA4D;QAC5D,4CAA4C;QAC5C,sCAAsC;QACtC,2CAA2C;QAC3C,8CAA8C;QAC9C,gDAAgD;QAChD,EAAE;QACF,mCAAmC;QACnC,qDAAqD;QACrD,6DAA6D;KAC9D,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,EAAE,EAAE;QACF,uBAAuB;QACvB,EAAE;QACF,kDAAkD;QAClD,6BAA6B;QAC7B,yCAAyC;QACzC,qDAAqD;QACrD,2BAA2B;QAC3B,gBAAgB;QAChB,2DAA2D;QAC3D,yCAAyC;QACzC,oDAAoD;QACpD,EAAE;QACF,KAAK;QACL,kCAAkC;QAClC,yCAAyC;QACzC,0CAA0C;QAC1C,6CAA6C;KAC9C,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,IAAI,EAAE;QACJ,sBAAsB;QACtB,EAAE;QACF,qCAAqC;QACrC,2BAA2B;QAC3B,oEAAoE;QACpE,oEAAoE;QACpE,gCAAgC;QAChC,yCAAyC;QACzC,mCAAmC;KACpC,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,SAAS,EAAE;QACT,oCAAoC;QACpC,EAAE;QACF,qDAAqD;QACrD,8BAA8B;QAC9B,4CAA4C;QAC5C,6BAA6B;QAC7B,4CAA4C;QAC5C,gDAAgD;QAChD,4BAA4B;QAC5B,+CAA+C;QAC/C,oBAAoB;KACrB,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,GAAG,EAAE;QACH,oCAAoC;QACpC,EAAE;QACF,qDAAqD;QACrD,gBAAgB;QAChB,0CAA0C;QAC1C,sCAAsC;QACtC,oDAAoD;QACpD,2CAA2C;QAC3C,uBAAuB;KACxB,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,WAAW,EAAE;QACX,uCAAuC;QACvC,EAAE;QACF,mEAAmE;QACnE,iDAAiD;QACjD,EAAE;QACF,gEAAgE;QAChE,qEAAqE;QACrE,4DAA4D;QAC5D,sEAAsE;QACtE,gDAAgD;QAChD,iEAAiE;QACjE,wEAAwE;QACxE,6CAA6C;QAC7C,qEAAqE;QACrE,EAAE;QACF,wCAAwC;QACxC,6CAA6C;KAC9C,CAAC,IAAI,CAAC,IAAI,CAAC;CACb,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from './types.js';
2
+ export declare const registerHelpTools: ToolRegistrar;
@@ -0,0 +1,39 @@
1
+ import { z } from 'zod';
2
+ import { TOOL_CATALOG, WORKFLOWS } from './help-data.js';
3
+ export const registerHelpTools = ({ server }) => {
4
+ server.tool('help', 'Show available tools, workflows, and usage guides. Call without arguments for full catalog, or specify a topic.', {
5
+ topic: z.string().optional().describe('Topic: "tools" (all tools), "workflows" (all workflows), "pa", "ea", "risk", "usability", "mdr", or a specific tool name (e.g. "risk_create_hazards")'),
6
+ }, async ({ topic }) => {
7
+ if (!topic) {
8
+ const categories = [...new Set(TOOL_CATALOG.map(t => t.category))];
9
+ const lines = ['=== Jira MCP Server 툴 카탈로그 ===', ''];
10
+ for (const cat of categories) {
11
+ lines.push(`[${cat}]`);
12
+ for (const t of TOOL_CATALOG.filter(t => t.category === cat)) {
13
+ lines.push(` ${t.name}: ${t.description}`);
14
+ }
15
+ lines.push('');
16
+ }
17
+ lines.push('워크플로우 가이드: help(topic="workflows") 또는 help(topic="pa"), help(topic="ea"), help(topic="risk"), help(topic="usability"), help(topic="mdr")');
18
+ lines.push('특정 툴 상세: help(topic="툴이름")');
19
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
20
+ }
21
+ if (WORKFLOWS[topic]) {
22
+ return { content: [{ type: 'text', text: WORKFLOWS[topic] }] };
23
+ }
24
+ if (topic === 'tools') {
25
+ const lines = TOOL_CATALOG.map(t => `${t.name} [${t.category}]: ${t.description}`);
26
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
27
+ }
28
+ if (topic === 'workflows') {
29
+ const lines = Object.values(WORKFLOWS).join('\n\n');
30
+ return { content: [{ type: 'text', text: lines }] };
31
+ }
32
+ const tool = TOOL_CATALOG.find(t => t.name === topic);
33
+ if (tool) {
34
+ return { content: [{ type: 'text', text: `${tool.name} [${tool.category}]\n${tool.description}\n\n자세한 파라미터는 이 툴을 직접 호출하여 확인하세요.` }] };
35
+ }
36
+ return { content: [{ type: 'text', text: `알 수 없는 토픽: "${topic}"\n사용 가능: tools, workflows, pa, ea, risk, usability, mdr, 또는 툴 이름` }] };
37
+ });
38
+ };
39
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/tools/help.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from './types.js';
2
+ export declare const registerIecTools: ToolRegistrar;
@@ -0,0 +1,203 @@
1
+ import { z } from 'zod';
2
+ const PA_DOCUMENTS = [
3
+ '[Intended Use]',
4
+ '[System Requirement Specification]',
5
+ '[Classification]',
6
+ '[SW Development Plan]',
7
+ '[Risk Management Plan]',
8
+ '[Security Maintenance Plan]',
9
+ '[Configuration Management Plan]',
10
+ ];
11
+ const EA_DOCUMENTS = [
12
+ '[Risk Management Report]',
13
+ '[SW Requirements Specification]',
14
+ '[SW Architecture Document]',
15
+ '[SW Detailed Design Document]',
16
+ ];
17
+ const LINK_GUIDE = '\n\nIMPORTANT - Link type rules:\n'
18
+ + '• Document → Gate: jira_create_link("Blocks", gateKey, documentKey) — Document blocks Gate\n'
19
+ + '• Sub-ticket → Document: jira_create_link("Relates", documentKey, subTicketKey) — Relates is bidirectional\n'
20
+ + '• Hazard → IU/SyRS: jira_create_link("Risk Source", hazardKey, syrsKey) — SyRS gives rise to Hazard\n'
21
+ + '• Requirement → Hazard: jira_create_link("Mitigates", requirementKey, hazardKey) — Requirement mitigates Hazard\n'
22
+ + '• Requirement → System Requirement: jira_create_link("Implements", requirementKey, syrsKey)\n'
23
+ + '• Architecture → Requirement: jira_create_link("Implements", architectureKey, requirementKey)\n'
24
+ + '• Detailed Design → Requirement/Architecture: jira_create_link("Implements", ddKey, targetKey)\n'
25
+ + '• Task → Detailed Design: jira_create_link("Implements", taskKey, ddKey)\n'
26
+ + '• 선행 Task → 후행 Task: jira_create_link("Blocks", 후행taskKey, 선행taskKey) — 선행이 후행을 block\n\n'
27
+ + 'IMPORTANT - Git commit message rules:\n'
28
+ + '• Every commit MUST start with the Jira ticket key: "SCW-xxx type: message"\n'
29
+ + '• Example: "SCW-77 feat: set up project scaffold and dev environment"\n'
30
+ + '• Multiple tickets: "SCW-30 SCW-69 chore: add dental 3D scan test files"\n'
31
+ + '• This enables Jira to auto-link commits to tickets\n'
32
+ + '• Commit after each meaningful change (document written, task completed, bug fixed)\n'
33
+ + '• Push after each commit or group of related commits\n\n'
34
+ + 'IMPORTANT - Scope of action rules:\n'
35
+ + '• "게이트 만들어" → ONLY create the Gate. Do NOT create Document tickets.\n'
36
+ + '• "문서 만들어" → ONLY create the specified Documents. Do NOT create sub-tickets.\n'
37
+ + '• Do NOT chain-create beyond what the user explicitly asked for.\n'
38
+ + '• When in doubt, ask the user before creating additional items.\n\n'
39
+ + 'IMPORTANT - Ticket creation rules:\n'
40
+ + '• Before creating a ticket, search JQL for existing similar tickets to avoid duplicates.\n'
41
+ + '• Bug description format: 😩 Problem → 🔎 Root Cause → 🔧 Fix → 🐛 Reproduction\n'
42
+ + '• Task/Feature description format: 🎯 Goal → 📋 Tasks → ✅ Acceptance Criteria\n'
43
+ + '• Do NOT auto-transition ticket status (e.g. In Progress → Done) unless explicitly asked.\n'
44
+ + '• When creating 3+ tickets at once, show the plan first and wait for user approval.\n\n'
45
+ + 'IMPORTANT - Commit-ticket linking:\n'
46
+ + '• After pushing commits, verify the ticket has the commit linked (auto-linked via ticket key in message).\n'
47
+ + '• If commits are not linked, add a comment to the ticket with the commit details.';
48
+ export const registerIecTools = (ctx) => {
49
+ const { server, jira } = ctx;
50
+ server.tool('iec_create_gate', 'Create a PA or EA Gate with all required Document tickets and Blocks links. Based on IEC 62304 lifecycle.', {
51
+ project_key: z.string().describe('Project key'),
52
+ phase: z.enum(['PA', 'EA']).describe('Phase: PA (7 documents) or EA (4 documents)'),
53
+ gate_summary: z.string().optional().describe('Gate summary (default: "PA Gate" or "EA Gate")'),
54
+ }, async ({ project_key, phase, gate_summary }) => {
55
+ const summary = gate_summary || `${phase} Gate`;
56
+ const documents = phase === 'PA' ? PA_DOCUMENTS : EA_DOCUMENTS;
57
+ // 1. Create Gate
58
+ const gate = await jira.createIssue({
59
+ project: { key: project_key },
60
+ summary,
61
+ issuetype: { name: 'Gate' },
62
+ customfield_10382: { value: phase },
63
+ });
64
+ const gateKey = gate.key;
65
+ // 2. Create Document tickets + link to Gate
66
+ const results = [];
67
+ for (const docTitle of documents) {
68
+ const doc = await jira.createIssue({
69
+ project: { key: project_key },
70
+ summary: docTitle,
71
+ issuetype: { name: 'Document' },
72
+ customfield_10382: { value: phase },
73
+ });
74
+ const docKey = doc.key;
75
+ // Gate is blocked by Document (inwardIssue=Gate, outwardIssue=Document)
76
+ await jira.createLink('Blocks', gateKey, docKey);
77
+ results.push({ key: docKey, summary: docTitle });
78
+ }
79
+ return { content: [{ type: 'text', text: JSON.stringify({
80
+ phase,
81
+ gate: { key: gateKey, summary },
82
+ documents: results,
83
+ total_created: results.length + 1,
84
+ message: `${phase} Gate created with ${results.length} documents. Use iec_get_next_steps on each document to see what to create next.`,
85
+ }, null, 2) }] };
86
+ });
87
+ server.tool('iec_get_next_steps', 'Get recommended next steps for a ticket based on its type and the IEC 62304 lifecycle. Tells Claude what to do next, including correct link types.', {
88
+ issue_key: z.string().describe('Current ticket key'),
89
+ }, async ({ issue_key }) => {
90
+ const data = await jira.getIssue(issue_key, ['summary', 'issuetype', 'status']);
91
+ const f = data.fields;
92
+ const type = f.issuetype?.name;
93
+ const summary = f.summary || '';
94
+ const steps = [];
95
+ if (type === 'Gate') {
96
+ steps.push('Gate created. For each Document ticket, call iec_get_next_steps to see what sub-tickets to create.');
97
+ if (summary.includes('PA')) {
98
+ steps.push('[Intended Use] Document → Create 1 Intended Use ticket, link with Relates');
99
+ steps.push('[System Requirement Spec] → Create System Requirement tickets, link each with Relates');
100
+ steps.push('[Classification] → Create 1 Classification ticket, link with Relates');
101
+ steps.push('[Risk Management Plan] through [Configuration Management Plan] → Generate document content');
102
+ }
103
+ else if (summary.includes('EA')) {
104
+ steps.push('[Risk Management Report] → Use risk_create_hazards to create Hazard tickets');
105
+ steps.push('[SW Requirements Spec] → Organize FR/NFR, use risk_create_mitigation to create Requirements');
106
+ steps.push('[SW Architecture Document] → Create Architecture Design tickets (architecture decisions, tech stack, deployment)');
107
+ steps.push('[SW Detailed Design Document] → Create Detailed Design tickets referencing SRS + SAD, then bottom-up Tasks');
108
+ }
109
+ }
110
+ else if (type === 'Document') {
111
+ if (summary.includes('Intended Use')) {
112
+ steps.push('Create 1 Intended Use ticket with: purpose, patient population, use environment, indication, clinical benefit');
113
+ steps.push('Link: jira_create_link("Relates", thisDocumentKey, newIntendedUseKey)');
114
+ }
115
+ else if (summary.includes('System Requirement')) {
116
+ steps.push('Read Intended Use ticket → derive System Requirements');
117
+ steps.push('Link each: jira_create_link("Relates", thisDocumentKey, newRequirementKey)');
118
+ }
119
+ else if (summary.includes('Classification')) {
120
+ steps.push('Analyze IU + SyRS → determine MDR classification');
121
+ steps.push('Link: jira_create_link("Relates", thisDocumentKey, newClassificationKey)');
122
+ }
123
+ else if (summary.includes('Risk Management Report')) {
124
+ steps.push('Read IU and System Requirements → identify hazards');
125
+ steps.push('Use risk_create_hazards to batch create (auto-links Risk Source + Relates)');
126
+ }
127
+ else if (summary.includes('SW Requirements')) {
128
+ steps.push('Organize into Functional Requirements (FR) and Non-Functional Requirements (NFR)');
129
+ steps.push('FR: features the system provides (file parsing, rendering, annotations, comments, sync, notifications, versioning, auth)');
130
+ steps.push('NFR: performance, security, reliability constraints');
131
+ steps.push('Read Hazard tickets → create mitigating Requirements');
132
+ steps.push('Use risk_create_mitigation (auto-links Mitigates + Implements + Relates)');
133
+ }
134
+ else if (summary.includes('Architecture')) {
135
+ steps.push('Create Architecture Design tickets — focus on ARCHITECTURE DECISIONS, not module decomposition');
136
+ steps.push('Content should cover: architecture style, technology stack choices, key design decisions, deployment strategy');
137
+ steps.push('Link each: jira_create_link("Implements", architectureKey, requirementKey)');
138
+ steps.push('Also link: jira_create_link("Relates", thisDocumentKey, architectureKey)');
139
+ }
140
+ else if (summary.includes('Detailed Design')) {
141
+ steps.push('Read SRS requirements AND SAD architecture decisions → create Detailed Design tickets');
142
+ steps.push('Each DD ticket must reference specific SRS requirements and SAD architecture decisions it implements');
143
+ steps.push('Include: component interfaces, algorithms, data structures, API specs');
144
+ steps.push('Link: jira_create_link("Implements", ddKey, architectureKey) and jira_create_link("Implements", ddKey, requirementKey)');
145
+ steps.push('Also link: jira_create_link("Relates", thisDocumentKey, ddKey)');
146
+ }
147
+ else {
148
+ steps.push('Generate document content based on referenced sources');
149
+ steps.push('Use doc_update_description to update the ticket');
150
+ }
151
+ }
152
+ else if (type === 'Hazard') {
153
+ steps.push('Hazard created with Risk values. In EA phase, create mitigating Requirements with risk_create_mitigation');
154
+ }
155
+ else if (type === 'Requirement') {
156
+ steps.push('Requirement linked to Hazards. Create Architecture tickets: jira_create_link("Implements", archKey, thisRequirementKey)');
157
+ }
158
+ else if (type === 'Intended Use' || type === 'System Requirement' || type === 'Classification') {
159
+ steps.push('This is a sub-ticket. Ensure it is linked to its parent Document with Relates.');
160
+ }
161
+ else if (type === 'Task') {
162
+ steps.push('Tasks should be planned bottom-up based on Detailed Design: infrastructure → data layer → services → UI → integration → testing');
163
+ steps.push('Implement the task, then transition status to Done');
164
+ }
165
+ return { content: [{ type: 'text', text: `${issue_key} (${type}): ${summary}\n\nNext steps:\n${steps.map(s => `• ${s}`).join('\n')}${LINK_GUIDE}` }] };
166
+ });
167
+ server.tool('sds_create_task', 'Create a Task ticket linked to SDS and Detailed Design tickets. Tasks should be planned bottom-up: infrastructure first, then data layer, services, UI, integration, testing. Each task references specific DD components.', {
168
+ project_key: z.string().describe('Project key'),
169
+ summary: z.string().describe('Task summary'),
170
+ description: z.string().optional().describe('Task description'),
171
+ sds_key: z.string().describe('SDS Document ticket key'),
172
+ dd_keys: z.array(z.string()).optional().describe('Detailed Design ticket keys to implement'),
173
+ phase: z.number().optional().describe('Implementation phase number'),
174
+ blocks: z.array(z.string()).optional().describe('Summary strings of tasks this blocks (for linking later)'),
175
+ }, async ({ project_key, summary, description, sds_key, dd_keys, phase, blocks }) => {
176
+ const { textToAdf } = await import('../jira-client.js');
177
+ const issue = await jira.createIssue({
178
+ project: { key: project_key },
179
+ summary,
180
+ issuetype: { name: 'Task' },
181
+ description: textToAdf(description || summary),
182
+ });
183
+ const issueKey = issue.key;
184
+ // Relates link → SDS
185
+ await jira.createLink('Relates', issueKey, sds_key);
186
+ // Implements links → Detailed Design
187
+ if (dd_keys) {
188
+ for (const ddKey of dd_keys) {
189
+ await jira.createLink('Implements', issueKey, ddKey);
190
+ }
191
+ }
192
+ return { content: [{ type: 'text', text: JSON.stringify({ key: issueKey, summary, phase: phase || null, implements_dd: dd_keys || [], sds: sds_key }, null, 2) }] };
193
+ });
194
+ server.tool('doc_update_description', 'Update a ticket description with document content', {
195
+ issue_key: z.string().describe('Ticket key'),
196
+ content: z.string().describe('Document content (markdown or plain text)'),
197
+ }, async ({ issue_key, content }) => {
198
+ const { textToAdf } = await import('../jira-client.js');
199
+ await jira.updateIssue(issue_key, { description: textToAdf(content) });
200
+ return { content: [{ type: 'text', text: `Updated ${issue_key} description (${content.length} chars)` }] };
201
+ });
202
+ };
203
+ //# sourceMappingURL=iec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iec.js","sourceRoot":"","sources":["../../src/tools/iec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from './types.js';
2
+ export declare const registerInitTools: ToolRegistrar;
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
3
+ import { join } from 'path';
4
+ export const registerInitTools = ({ server }) => {
5
+ server.tool('jira_init_project', 'Initialize Jira project for the current workspace. Appends the project key to CLAUDE.md so Claude knows which Jira project to use. Run this once per project folder.', {
6
+ project_key: z.string().describe('Jira project key (e.g. SCW, NEO)'),
7
+ }, async ({ project_key }) => {
8
+ const cwd = process.cwd();
9
+ const claudeMdPath = join(cwd, 'CLAUDE.md');
10
+ const line = `이 프로젝트의 Jira key는 ${project_key}입니다.`;
11
+ try {
12
+ let content = '';
13
+ if (existsSync(claudeMdPath)) {
14
+ content = readFileSync(claudeMdPath, 'utf-8');
15
+ if (content.includes(line)) {
16
+ return { content: [{ type: 'text', text: `이미 CLAUDE.md에 ${project_key} 프로젝트 설정이 있습니다.` }] };
17
+ }
18
+ if (!content.endsWith('\n'))
19
+ content += '\n';
20
+ content += '\n' + line + '\n';
21
+ }
22
+ else {
23
+ content = line + '\n';
24
+ }
25
+ writeFileSync(claudeMdPath, content, 'utf-8');
26
+ return {
27
+ content: [{
28
+ type: 'text',
29
+ text: `CLAUDE.md에 "${line}" 추가 완료.\n이제 Claude가 이 프로젝트에서 Jira key "${project_key}"를 자동으로 사용합니다.`,
30
+ }],
31
+ };
32
+ }
33
+ catch (e) {
34
+ return { content: [{ type: 'text', text: `Error: ${e.message}` }] };
35
+ }
36
+ });
37
+ };
38
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC7D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,CAAC,MAAM,iBAAiB,GAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;IAC7D,MAAM,CAAC,IAAI,CACT,mBAAmB,EACnB,sKAAsK,EACtK;QACE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;KACrE,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;QACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,qBAAqB,WAAW,MAAM,CAAC;QAEpD,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,EAAE,CAAC;YACjB,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC7B,OAAO,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,WAAW,iBAAiB,EAAE,CAAC,EAAE,CAAC;gBAC9F,CAAC;gBACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAAE,OAAO,IAAI,IAAI,CAAC;gBAC7C,OAAO,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;YAChC,CAAC;iBAAM,CAAC;gBACN,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;YACxB,CAAC;YAED,aAAa,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,eAAe,IAAI,2CAA2C,WAAW,gBAAgB;qBAChG,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;QACtE,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from './types.js';
2
+ export declare const registerJiraCrudTools: ToolRegistrar;