@neobiotechlabs/neobiotech-dev-agent 0.1.18 → 0.1.19

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.
@@ -10,7 +10,7 @@
10
10
  "source": "npm",
11
11
  "package": "@neobiotechlabs/neobiotech-dev-agent",
12
12
  "registry": "https://registry.npmjs.org",
13
- "version": "0.1.18"
13
+ "version": "0.1.19"
14
14
  },
15
15
  "description": "의료기기 SW 규제 개발 자동화 (Jira·Confluence·Risk·CVSS·Xray·IEC 62304/62366·MDR·문서 렌더)",
16
16
  "category": "medical-device",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neobiotech-dev-agent",
3
- "version": "0.1.18",
3
+ "version": "0.1.19",
4
4
  "displayName": "NeoBiotech Dev Agent (MedDev)",
5
5
  "description": "의료기기 SW 규제 개발 자동화 — Jira·Confluence·Risk·CVSS·Xray·IEC 62304/62366·MDR·문서 렌더",
6
6
  "author": {
package/README.md CHANGED
@@ -413,7 +413,7 @@ PA Gate
413
413
  └── Use Scenario ── Relates ──→ Use Spec
414
414
  └── Abnormal Use Scenario ── Risk Source ──→ Hazard
415
415
 
416
- EA Gate
416
+ EA Gate (8 living documents — EA 초기 결정·승인 / ER 개발·검증 중 갱신 / CA 최종 확정)
417
417
  ├── [Risk Management Report] ── Blocks ──→ Gate
418
418
  │ └── Hazard ── Risk Source ──→ IU/SyRS / Use Scenario
419
419
  │ └── Hazard ── Relates ──→ RMR Document
@@ -422,11 +422,13 @@ EA Gate
422
422
  │ └── Requirement ── Implements ──→ System Requirement
423
423
  ├── [SW Architecture Document] ── Blocks ──→ Gate
424
424
  │ └── Architecture ── Implements ──→ Requirement
425
- └── [SW Detailed Design Document] ── Blocks ──→ Gate
426
- └── Detailed Design ── Implements ──→ Requirement
427
- └── Detailed Design ── Implements ──→ Architecture
428
- └── Task ── Implements ──→ Detailed Design
429
- └── 선행 Task ── Blocks ──→ 후행 Task
425
+ ├── [SW Detailed Design Document] ── Blocks ──→ Gate
426
+ └── Detailed Design ── Implements ──→ Requirement/Architecture
427
+ └── Task ── Implements ──→ Detailed Design
428
+ ├── [SOUP List] ── Blocks ──→ Gate (doc_render; CA 최종 SBOM 기반 확정)
429
+ ├── [Usability Evaluation Plan] ── Blocks ──→ Gate (doc_render; use_spec/scenarios 연계)
430
+ ├── [Clinical Evaluation Plan] ── Blocks ──→ Gate (doc_render)
431
+ └── [List of Hazard-Related Use Scenarios] ── Blocks ──→ Gate (abnormal scenarios 연계)
430
432
  ```
431
433
 
432
434
  ## 릴리즈 절차
package/dist/index.js CHANGED
@@ -160549,14 +160549,18 @@ var EA_DOCUMENTS = [
160549
160549
  "[Risk Management Report]",
160550
160550
  "[SW Requirements Specification]",
160551
160551
  "[SW Architecture Document]",
160552
- "[SW Detailed Design Document]"
160552
+ "[SW Detailed Design Document]",
160553
+ "[SOUP List]",
160554
+ "[Usability Evaluation Plan]",
160555
+ "[Clinical Evaluation Plan]",
160556
+ "[List of Hazard-Related Use Scenarios]"
160553
160557
  ];
160554
160558
  var LINK_GUIDE = '\n\nIMPORTANT - Link type rules:\n\u2022 Document \u2192 Gate: jira_create_link("Blocks", gateKey, documentKey) \u2014 Document blocks Gate\n\u2022 Sub-ticket \u2192 Document: jira_create_link("Relates", documentKey, subTicketKey) \u2014 Relates is bidirectional\n\u2022 Hazard \u2192 IU/SyRS: jira_create_link("Risk Source", hazardKey, syrsKey) \u2014 SyRS gives rise to Hazard\n\u2022 Requirement \u2192 Hazard: jira_create_link("Mitigates", requirementKey, hazardKey) \u2014 Requirement mitigates Hazard\n\u2022 Requirement \u2192 System Requirement: jira_create_link("Implements", requirementKey, syrsKey)\n\u2022 Architecture \u2192 Requirement: jira_create_link("Implements", architectureKey, requirementKey)\n\u2022 Detailed Design \u2192 Requirement/Architecture: jira_create_link("Implements", ddKey, targetKey)\n\u2022 Task \u2192 Detailed Design: jira_create_link("Implements", taskKey, ddKey)\n\u2022 \uC120\uD589 Task \u2192 \uD6C4\uD589 Task: jira_create_link("Blocks", \uD6C4\uD589taskKey, \uC120\uD589taskKey) \u2014 \uC120\uD589\uC774 \uD6C4\uD589\uC744 block\n\nIMPORTANT - Git commit message rules:\n\u2022 Every commit MUST start with the Jira ticket key: "SCW-xxx type: message"\n\u2022 Example: "SCW-77 feat: set up project scaffold and dev environment"\n\u2022 Multiple tickets: "SCW-30 SCW-69 chore: add dental 3D scan test files"\n\u2022 This enables Jira to auto-link commits to tickets\n\u2022 Commit after each meaningful change (document written, task completed, bug fixed)\n\u2022 Push after each commit or group of related commits\n\nIMPORTANT - Scope of action rules:\n\u2022 "\uAC8C\uC774\uD2B8 \uB9CC\uB4E4\uC5B4" \u2192 ONLY create the Gate. Do NOT create Document tickets.\n\u2022 "\uBB38\uC11C \uB9CC\uB4E4\uC5B4" \u2192 ONLY create the specified Documents. Do NOT create sub-tickets.\n\u2022 Do NOT chain-create beyond what the user explicitly asked for.\n\u2022 When in doubt, ask the user before creating additional items.\n\nIMPORTANT - Ticket creation rules:\n\u2022 Before creating a ticket, search JQL for existing similar tickets to avoid duplicates.\n\u2022 Bug description format: \u{1F629} Problem \u2192 \u{1F50E} Root Cause \u2192 \u{1F527} Fix \u2192 \u{1F41B} Reproduction\n\u2022 Task/Feature description format: \u{1F3AF} Goal \u2192 \u{1F4CB} Tasks \u2192 \u2705 Acceptance Criteria\n\u2022 Do NOT auto-transition ticket status (e.g. In Progress \u2192 Done) unless explicitly asked.\n\u2022 When creating 3+ tickets at once, show the plan first and wait for user approval.\n\nIMPORTANT - Commit-ticket linking:\n\u2022 After pushing commits, verify the ticket has the commit linked (auto-linked via ticket key in message).\n\u2022 If commits are not linked, add a comment to the ticket with the commit details.';
160555
160559
  var registerIecTools = (ctx2) => {
160556
160560
  const { server: server2, jira: jira2 } = ctx2;
160557
160561
  server2.tool("iec_create_gate", "Create a PA or EA Gate with all required Document tickets and Blocks links. Based on IEC 62304 lifecycle.", {
160558
160562
  project_key: external_exports.string().describe("Project key"),
160559
- phase: external_exports.enum(["PA", "EA"]).describe("Phase: PA (7 documents) or EA (4 documents)"),
160563
+ phase: external_exports.enum(["PA", "EA"]).describe("Phase: PA (7 documents) or EA (8 documents)"),
160560
160564
  gate_summary: external_exports.string().optional().describe('Gate summary (default: "PA Gate" or "EA Gate")')
160561
160565
  }, async ({ project_key, phase, gate_summary }) => {
160562
160566
  const summary = gate_summary || `${phase} Gate`;
@@ -160604,10 +160608,15 @@ var registerIecTools = (ctx2) => {
160604
160608
  steps.push("[Classification] \u2192 Create 1 Classification ticket, link with Relates");
160605
160609
  steps.push("[Risk Management Plan] through [Configuration Management Plan] \u2192 Generate document content");
160606
160610
  } else if (summary.includes("EA")) {
160607
- steps.push("[Risk Management Report] \u2192 Use risk_create_hazards to create Hazard tickets");
160608
- steps.push("[SW Requirements Spec] \u2192 Organize FR/NFR, use risk_create_mitigation to create Requirements");
160609
- steps.push("[SW Architecture Document] \u2192 Create Architecture Design tickets (architecture decisions, tech stack, deployment)");
160610
- steps.push("[SW Detailed Design Document] \u2192 Create Detailed Design tickets referencing SRS + SAD, then bottom-up Tasks");
160611
+ steps.push("EA Gate \u2014 8\uAC1C living documents (EA \uCD08\uAE30 \uACB0\uC815\xB7\uC2B9\uC778 \u2192 ER \uAC1C\uBC1C\xB7\uAC80\uC99D \uC911 \uAC31\uC2E0 \u2192 CA \uCD5C\uC885 \uD655\uC815).");
160612
+ steps.push("[Risk Management Report] \u2192 risk_create_hazards (FMEA \uC704\uD5D8 \uC2DD\uBCC4; \uC0C8 \uC704\uD5D8\xB7\uD1B5\uC81C \uCD94\uAC00 \uC2DC \uAC31\uC2E0)");
160613
+ steps.push("[SW Requirements Spec] \u2192 FR/NFR \uC815\uB9AC + risk_create_mitigation (\uC694\uAD6C\uC0AC\uD56D \uBCC0\uACBD\xB7\uCD94\uAC00 \uC2DC \uAC31\uC2E0)");
160614
+ steps.push("[SW Architecture Document] \u2192 \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815 \uD2F0\uCF13 (\uBCC0\uACBD\xB7\uC0C1\uC138\uD654 \uC2DC \uAC31\uC2E0)");
160615
+ steps.push("[SW Detailed Design Document] \u2192 \uC720\uB2DB \uC0C1\uC138\uC124\uACC4 \uD2F0\uCF13 + bottom-up Tasks (sprint\uB9C8\uB2E4 \uC720\uB2DB \uCD94\uAC00\xB7\uC0C1\uC138\uD654 \uC2DC \uAC31\uC2E0)");
160616
+ steps.push("[SOUP List] \u2192 SOUP \uC2DD\uBCC4 (\uC2E4\uC81C \uC758\uC874\uC131 \uCD94\uAC00/\uC81C\uAC70/\uBC84\uC804\uC5C5 \uC2DC \uAC31\uC2E0; CA \uCD5C\uC885 SBOM \uAE30\uBC18 \uD655\uC815)");
160617
+ steps.push("[Usability Evaluation Plan] \u2192 \uC0AC\uC6A9\uC131 \uD3C9\uAC00 \uACC4\uD68D (\uD3C9\uAC00 \uACB0\uACFC \uBC18\uC601\xB7\uACC4\uD68D \uC870\uC815 \uC2DC \uAC31\uC2E0)");
160618
+ steps.push("[Clinical Evaluation Plan] \u2192 \uC784\uC0C1 \uD3C9\uAC00 \uACC4\uD68D (\uD3C9\uAC00 \uACB0\uACFC \uBC18\uC601\xB7\uACC4\uD68D \uC870\uC815 \uC2DC \uAC31\uC2E0)");
160619
+ steps.push("[List of Hazard-Related Use Scenarios] \u2192 \uC704\uD5D8 \uAD00\uB828 \uC0AC\uC6A9 \uC2DC\uB098\uB9AC\uC624 \uC2DD\uBCC4 (\uC0C8 \uC2DC\uB098\uB9AC\uC624 \uC2DD\uBCC4 \uC2DC \uAC31\uC2E0)");
160611
160620
  }
160612
160621
  } else if (type === "Document") {
160613
160622
  if (summary.includes("Intended Use")) {
@@ -160639,6 +160648,17 @@ var registerIecTools = (ctx2) => {
160639
160648
  steps.push("Include: component interfaces, algorithms, data structures, API specs");
160640
160649
  steps.push('Link: jira_create_link("Implements", ddKey, architectureKey) and jira_create_link("Implements", ddKey, requirementKey)');
160641
160650
  steps.push('Also link: jira_create_link("Relates", thisDocumentKey, ddKey)');
160651
+ } else if (summary.includes("SOUP")) {
160652
+ steps.push('\uC2DD\uBCC4\uB41C SOUP(third-party \uC758\uC874\uC131) \uBAA9\uB85D\uD654 \u2014 doc_render(template="soup_list")\uB85C \uB80C\uB354');
160653
+ steps.push("CA \uCD5C\uC885 \uD655\uC815 \uC804\uAE4C\uC9C0 \uC758\uC874\uC131 \uBCC0\uACBD(\uCD94\uAC00/\uC81C\uAC70/\uBC84\uC804\uC5C5)\uB9C8\uB2E4 \uAC31\uC2E0");
160654
+ } else if (summary.includes("Usability Evaluation Plan")) {
160655
+ steps.push("\uC0AC\uC6A9\uC131 \uD3C9\uAC00 \uACC4\uD68D \uC218\uB9BD \u2014 usability_create_use_spec / usability_create_scenarios\uC640 \uC5F0\uACC4");
160656
+ steps.push('doc_render(template="usability_evaluation_plan")\uB85C \uB80C\uB354');
160657
+ } else if (summary.includes("Clinical Evaluation Plan")) {
160658
+ steps.push('\uC784\uC0C1 \uD3C9\uAC00 \uACC4\uD68D \uC218\uB9BD \u2014 doc_render(template="clinical_evaluation_plan")\uB85C \uB80C\uB354');
160659
+ } else if (summary.includes("Hazard-Related")) {
160660
+ steps.push('\uC704\uD5D8 \uAD00\uB828 \uC0AC\uC6A9 \uC2DC\uB098\uB9AC\uC624 \uC2DD\uBCC4 \u2014 usability_create_scenarios(type="abnormal")\uC640 \uC5F0\uACC4');
160661
+ steps.push('doc_render(template="list_of_hazard_related_use_scenarios")\uB85C \uB80C\uB354');
160642
160662
  } else {
160643
160663
  steps.push("Generate document content based on referenced sources");
160644
160664
  steps.push("Use doc_update_description to update the ticket");
@@ -160787,21 +160807,32 @@ var WORKFLOWS = {
160787
160807
  ea: [
160788
160808
  "=== EA Gate \uC6CC\uD06C\uD50C\uB85C\uC6B0 ===",
160789
160809
  "",
160790
- "1. iec_create_gate \u2192 EA Gate + 4\uAC1C Document \uD2F0\uCF13 \uC0DD\uC131",
160791
- "2. [Risk Management Report]",
160792
- " - risk_create_hazards \u2192 Hazard \uC77C\uAD04 \uC0DD\uC131",
160793
- " - usability_link_to_hazard \u2192 \uC0AC\uC6A9 \uC2DC\uB098\uB9AC\uC624 \u2192 Hazard \uC5F0\uACB0",
160794
- "3. [SW Requirements Spec]",
160795
- " - FR/NFR \uC815\uB9AC",
160796
- " - risk_create_mitigation \u2192 \uC644\uD654 Requirement \uC0DD\uC131 + P2 \uC5C5\uB370\uC774\uD2B8",
160797
- "4. [SW Architecture Document] \u2192 \uC544\uD0A4\uD14D\uCC98 \uC124\uACC4",
160798
- "5. [SW Detailed Design Document] \u2192 \uC0C1\uC138 \uC124\uACC4 + Task \uC0DD\uC131",
160810
+ "1. iec_create_gate \u2192 EA Gate + 8\uAC1C Document \uD2F0\uCF13 \uC0DD\uC131 (living documents)",
160811
+ "2. [Risk Management Report] \u2192 risk_create_hazards (FMEA) + usability_link_to_hazard",
160812
+ "3. [SW Requirements Spec] \u2192 FR/NFR \uC815\uB9AC + risk_create_mitigation",
160813
+ "4. [SW Architecture Document] \u2192 \uC544\uD0A4\uD14D\uCC98 \uACB0\uC815",
160814
+ "5. [SW Detailed Design Document] \u2192 \uC720\uB2DB \uC0C1\uC138\uC124\uACC4 + bottom-up Tasks",
160815
+ "6. [SOUP List] \u2192 doc_render(soup_list)",
160816
+ "7. [Usability Evaluation Plan] \u2192 usability_create_use_spec/scenarios \uC5F0\uACC4 + doc_render",
160817
+ "8. [Clinical Evaluation Plan] \u2192 doc_render(clinical_evaluation_plan)",
160818
+ "9. [List of Hazard-Related Use Scenarios] \u2192 usability_create_scenarios(abnormal) \uC5F0\uACC4",
160819
+ "",
160820
+ "EA 8\uAC1C \uBB38\uC11C = living document (IEC 62304 evolutionary \uBAA8\uB378):",
160821
+ " \u2022 EA: \uCD08\uAE30 \uACB0\uC815\xB7\uC2B9\uC778 / ER: \uAC1C\uBC1C\xB7\uAC80\uC99D \uC911 \uAC31\uC2E0 / CA: \uCD5C\uC885 \uD655\uC815",
160822
+ " \u2022 \uAC31\uC2E0 \uD2B8\uB9AC\uAC70:",
160823
+ " - SRS: \uC694\uAD6C\uC0AC\uD56D \uBCC0\uACBD/\uCD94\uAC00 (change-evaluation-list \uC5F0\uACC4)",
160824
+ " - SAD: \uC544\uD0A4\uD14D\uCC98 \uBCC0\uACBD/\uC0C1\uC138\uD654 (architecture-checklist)",
160825
+ " - SDD: sprint \uC720\uB2DB \uCD94\uAC00/\uC0C1\uC138\uD654",
160826
+ " - FMEA Risk Table: \uC0C8 \uC704\uD5D8\xB7\uD1B5\uC81C \uC2DD\uBCC4 (hazard \uCD94\uAC00)",
160827
+ " - SOUP List: \uC758\uC874\uC131 \uBCC0\uACBD (\u2192 CA \uCD5C\uC885 SBOM \uAE30\uBC18 \uD655\uC815)",
160828
+ " - Usability/Clinical Eval Plan: \uD3C9\uAC00 \uACB0\uACFC \uBC18\uC601\xB7\uACC4\uD68D \uC870\uC815",
160829
+ " - Hazard-Related Use Scenarios: \uC0C8 \uC2DC\uB098\uB9AC\uC624 \uC2DD\uBCC4",
160799
160830
  "",
160800
160831
  "\uAC80\uC99D:",
160801
- "6. xray_create_test \u2192 \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4 \uC0DD\uC131",
160802
- "7. usability_create_validation \u2192 \uC0AC\uC6A9\uC131 \uAC80\uC99D",
160803
- "8. doc_check_completeness \u2192 \uAE30\uC220 \uBB38\uC11C \uC644\uC804\uC131 \uAC80\uC99D",
160804
- "9. doc_generate_evidence \u2192 NB \uC2EC\uC0AC\uC6A9 \uC99D\uAC70 \uD328\uD0A4\uC9C0 \uC0DD\uC131"
160832
+ "10. xray_create_test \u2192 \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4 \uC0DD\uC131",
160833
+ "11. usability_create_validation \u2192 \uC0AC\uC6A9\uC131 \uAC80\uC99D",
160834
+ "12. doc_check_completeness \u2192 \uAE30\uC220 \uBB38\uC11C \uC644\uC804\uC131 \uAC80\uC99D",
160835
+ "13. doc_generate_evidence \u2192 NB \uC2EC\uC0AC\uC6A9 \uC99D\uAC70 \uD328\uD0A4\uC9C0 \uC0DD\uC131"
160805
160836
  ].join("\n"),
160806
160837
  risk: [
160807
160838
  "=== \uB9AC\uC2A4\uD06C \uAD00\uB9AC \uC6CC\uD06C\uD50C\uB85C\uC6B0 ===",
@@ -161482,6 +161513,7 @@ var TEMPLATE_PATHS = {
161482
161513
  // mdr_docs — EA gate (IEC 62304 Evolutionary Assessment 산출물)
161483
161514
  software_requirements_list: { path: "mdr_docs/EA/software-requirements-list.md", mode: "freeform", domain: "mdr", gate: "EA" },
161484
161515
  software_architecture_description: { path: "mdr_docs/EA/software-architecture-description.md", mode: "freeform", domain: "mdr", gate: "EA" },
161516
+ software_detailed_design: { path: "mdr_docs/EA/software-detailed-design.md", mode: "freeform", domain: "mdr", gate: "EA" },
161485
161517
  risk_table_fmea: { path: "mdr_docs/EA/risk-table-fmea.md", mode: "freeform", domain: "mdr", gate: "EA" },
161486
161518
  soup_list: { path: "mdr_docs/EA/soup-list.md", mode: "freeform", domain: "mdr", gate: "EA" },
161487
161519
  usability_evaluation_plan: { path: "mdr_docs/EA/usability-evaluation-plan.md", mode: "freeform", domain: "mdr", gate: "EA" },
@@ -161489,7 +161521,7 @@ var TEMPLATE_PATHS = {
161489
161521
  list_of_hazard_related_use_scenarios: { path: "mdr_docs/EA/list-of-hazard-related-use-scenarios.md", mode: "freeform", domain: "mdr", gate: "EA" }
161490
161522
  };
161491
161523
  var TEMPLATE_NAMES = Object.keys(TEMPLATE_PATHS);
161492
- var TEMPLATE_VERSION = "b1dbcb6";
161524
+ var TEMPLATE_VERSION = "17d0c4e";
161493
161525
 
161494
161526
  // src/tools/doc-render.ts
161495
161527
  init_adf();
@@ -184691,7 +184723,7 @@ var xrayClientSecret = process.env.XRAY_CLIENT_SECRET || "";
184691
184723
  var xray = xrayClientId && xrayClientSecret ? new XrayClient(xrayClientId, xrayClientSecret, jiraUrl, jiraEmail, jiraToken) : null;
184692
184724
  var server = new McpServer({
184693
184725
  name: "jira-confluence",
184694
- version: "0.1.18"
184726
+ version: "0.1.19"
184695
184727
  });
184696
184728
  var ctx = { server, jira, confluence, risk, xray };
184697
184729
  registerJiraCrudTools(ctx);