agent-safety-oss 1.6.1 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,13 +5,22 @@ All notable changes to `agent-safety-oss` are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [1.7.0] — 2026-06-13
9
+
10
+ 안전 문서를 표 구조·법령 연결을 보존하는 DocLang 형식으로도 출력할 수 있습니다.
11
+
12
+ ### 추가
13
+
14
+ - **DocLang 출력 옵션 (experimental)** — `generate_safety_document` 호출 시 `format: "doclang"` 을 지정하면 표의 병합 칸·채워야 할 빈칸·법령 근거 연결이 보존되는 XML 문서를 받습니다. 다른 AI 에게 문서 검수를 맡기거나 문서 검색(RAG) 자료로 쌓을 때 Markdown 보다 구조 정보가 정확하게 전달됩니다. 같은 문서를 두 형식으로 비교 검증한 결과, 표 병합 구조와 문서 분류 정보는 DocLang 에서만 정확히 전달되는 것을 확인했습니다.
15
+ - 기본 출력은 기존과 같은 Markdown 입니다 — 따로 지정하지 않으면 쓰던 방식 그대로 동작합니다.
16
+
8
17
  ## [1.6.1] — 2026-06-10
9
18
 
10
19
  문서를 처음 보는 분 기준으로 다시 정리하고, 도구가 표시하는 버전 오류를 바로잡았습니다.
11
20
 
12
21
  ### 수정
13
22
 
14
- - 런타임이 표시하는 버전(`src/version.ts`)이 v1.5.0 으로 남아 있던 문제를 바로잡았습니다. MCP 서버 선언·CLI 배너·프로젝트 정보 조회가 이제 실제 패키지 버전을 표시합니다. 재발하지 않도록 release 전 자동 검사에 버전 일치 항목을 추가했습니다.
23
+ - 도구가 자신을 이전 버전(v1.5.0)으로 표시하던 문제를 바로잡았습니다. MCP 서버 선언·CLI 배너·프로젝트 정보 조회가 이제 실제 패키지 버전을 표시합니다. 재발하지 않도록 release 전 자동 검사에 버전 일치 항목을 추가했습니다.
15
24
 
16
25
  ### 개선
17
26
 
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)
6
6
  [![Node](https://img.shields.io/badge/node-%3E%3D20.19-brightgreen)](https://nodejs.org)
7
7
  [![MCP](https://img.shields.io/badge/MCP-1.x-purple)](https://modelcontextprotocol.io)
8
- [![Release](https://img.shields.io/badge/release-v1.6.1-blue.svg)](./CHANGELOG.md)
8
+ [![Release](https://img.shields.io/badge/release-v1.7.0-blue.svg)](./CHANGELOG.md)
9
9
  [![Tools](https://img.shields.io/badge/MCP%20tools-92-orange.svg)](./docs/IDENTITY.md)
10
10
 
11
11
  **건설현장의 법정 안전문서 작성을 더 빠르고 정확하게.** 산안법·기준규칙·중처법·KOSHA 기술지원규정(가이드)을 기반으로 안전관리자와 현장소장의 문서 작성과 검토를 돕는 오픈소스 도구입니다.
@@ -68,7 +68,7 @@ LLM은 이 그래프를 보고 문서를 작성하거나 설명할 수 있지만
68
68
  | **MCP 도구 <!-- INV:TOOLS_TOTAL -->92<!-- /INV:TOOLS_TOTAL -->개** | 키 없이 바로 쓰는 <!-- INV:TOOLS_KEYLESS -->85<!-- /INV:TOOLS_KEYLESS -->개 + 공공 API 키 필요 <!-- INV:TOOLS_KEYREQ -->7<!-- /INV:TOOLS_KEYREQ -->개 (그중 <!-- INV:TOOLS_PLACEHOLDER -->2<!-- /INV:TOOLS_PLACEHOLDER -->개는 공공누리 라이선스 사유로 다운로드 URL 안내만 하는 placeholder) |
69
69
  | **위험·통제 정보망** | 작업 → 위험요인 → 통제대책 → 법령 근거 → 문서 자동 연결. 그래프 노드 <!-- INV:GRAPH_TOTAL -->3,369<!-- /INV:GRAPH_TOTAL -->개 (카테고리 1단계 <!-- INV:GRAPH_TOPLEVEL -->2,212<!-- /INV:GRAPH_TOPLEVEL --> + KOSHA Guide 1,039) · 엣지 약 <!-- INV:GRAPH_EDGES -->32,963<!-- /INV:GRAPH_EDGES --> · WorkActivity <!-- INV:GRAPH_ACTIVITIES -->41<!-- /INV:GRAPH_ACTIVITIES --> / Hazard <!-- INV:GRAPH_HAZARDS -->38<!-- /INV:GRAPH_HAZARDS --> / Control <!-- INV:GRAPH_CONTROLS -->50<!-- /INV:GRAPH_CONTROLS --> |
70
70
 
71
- → 위 자료들이 **서로 연결**되어 있어, "굴착 작업"이라는 한 단어만 알면 적용 법령·KOSHA 가이드·위험·통제·양식이 자동으로 따라옵니다. (패키지 버전: <!-- INV:VERSION -->1.6.1<!-- /INV:VERSION -->)
71
+ → 위 자료들이 **서로 연결**되어 있어, "굴착 작업"이라는 한 단어만 알면 적용 법령·KOSHA 가이드·위험·통제·양식이 자동으로 따라옵니다. (패키지 버전: <!-- INV:VERSION -->1.7.0<!-- /INV:VERSION -->)
72
72
 
73
73
  ## 시작하기
74
74
 
@@ -203,19 +203,10 @@ archive_safety_document 로컬 보관
203
203
 
204
204
  핵심은 문서를 바로 "그럴듯하게" 쓰는 것이 아니라, **그래프 컨텍스트를 먼저 조립하고, 초안을 만들고, 검수한 뒤 보관**하는 것입니다.
205
205
 
206
- ```mermaid
207
- flowchart LR
208
- U[안전관리자 / 현장소장] --> A[Claude Desktop / Codex CLI]
209
- A --> G[get_safety_document_guide]
210
- A --> C[assemble_doc_context]
211
- A --> P[get_site_profile]
212
- G --> D[generate_safety_document]
213
- C --> D
214
- P --> D
215
- D --> R[review_safety_document]
216
- R -->|보강 필요| U
217
- R -->|결재 가능| S[archive_safety_document]
218
- ```
206
+ <picture>
207
+ <source media="(prefers-color-scheme: dark)" srcset="./docs/assets/autowrite-flow-dark.svg">
208
+ <img alt="자동작성 흐름 사용자 요청을 AI 비서가 받아 양식 가이드·그래프 근거·현장 프로파일을 조립하고, 초안 생성과 검수를 거쳐 결재 가능한 문서만 보관합니다. 보강이 필요하면 사용자에게 되돌아갑니다." src="./docs/assets/autowrite-flow-light.svg">
209
+ </picture>
219
210
 
220
211
  1. 사용자가 "오늘 굴착 작업 TBM 만들어줘"처럼 요청한다.
221
212
  2. Agent가 `get_safety_document_guide`로 양식 구조와 필수 항목을 확인한다.
@@ -227,6 +218,8 @@ flowchart LR
227
218
 
228
219
  `assemble_doc_context`와 `generate_safety_document`의 조합이 핵심입니다 — 전자는 LLM이 추측하지 않도록 근거를 모으고, 후자는 그 근거를 결재 가능한 Markdown 문서로 합성합니다.
229
220
 
221
+ 출력은 기본적으로 기존과 같은 Markdown입니다. 양식의 병합 셀·빈칸·법령 근거 연결까지 보존해 다른 LLM 검수나 문서 RAG에 넘기고 싶다면 `generate_safety_document` 호출 시 `format: "doclang"`을 지정할 수 있습니다. 이 DocLang v0.6 XML 출력은 현재 experimental 옵션입니다.
222
+
230
223
  폼 UI([B. 브라우저 입력 폼](#b-브라우저-입력-폼--ai-비서cli-불필요))와 함께 쓰는 경우에는 `render_a2ui_form` (입력 폼 생성) → `save_form_draft` / `load_form_draft` (임시 저장·재로딩) → `submit_safety_document` (실제 문서 생성 흐름으로 제출) 를 같이 사용합니다.
231
224
 
232
225
  ## 현장 운영 흐름
@@ -0,0 +1,62 @@
1
+ export declare const DOCLANG_VERSION = "0.6";
2
+ import type { DocumentNode, DocumentSection } from "./graph-nodes-loader.js";
3
+ declare const LIST_CLASS_ORDERED = "ordered";
4
+ declare const LIST_CLASS_UNORDERED = "unordered";
5
+ export interface DoclangCellBlock {
6
+ type: "heading" | "text" | "list" | "table";
7
+ text?: unknown;
8
+ level?: number;
9
+ listType?: typeof LIST_CLASS_ORDERED | typeof LIST_CLASS_UNORDERED;
10
+ children?: DoclangCellBlock[];
11
+ table?: DoclangTable;
12
+ }
13
+ export interface DoclangTableCell {
14
+ text?: unknown;
15
+ blocks?: DoclangCellBlock[];
16
+ colSpan?: number;
17
+ rowSpan?: number;
18
+ isHeader?: boolean;
19
+ }
20
+ export interface DoclangTable {
21
+ caption?: string;
22
+ rows: DoclangTableCell[][];
23
+ hasHeader?: boolean;
24
+ customXml?: string;
25
+ }
26
+ export interface DoclangKoshaGuideInfo {
27
+ iri: string;
28
+ guideNo: string;
29
+ title: string;
30
+ }
31
+ export interface DoclangHazardInfo {
32
+ iri: string;
33
+ label: string;
34
+ category: string;
35
+ mitigatedBy?: string[];
36
+ koshaArchiveFacets?: string[];
37
+ }
38
+ export interface DoclangControlInfo {
39
+ iri: string;
40
+ label: string;
41
+ ericLevel: number;
42
+ }
43
+ export interface SafetyDocumentDoclangInput {
44
+ document: DocumentNode;
45
+ draft: Record<string, unknown>;
46
+ sections: DocumentSection[];
47
+ kosha: DoclangKoshaGuideInfo[];
48
+ hazards: DoclangHazardInfo[];
49
+ controls: DoclangControlInfo[];
50
+ directControlIris: ReadonlySet<string>;
51
+ legalBodyByIri: ReadonlyMap<string, string | undefined>;
52
+ hazardFallbackSuppressed: boolean;
53
+ documentCategory: string;
54
+ missingRequiredCount: number;
55
+ statusText?: string;
56
+ safetyDisclaimer?: string;
57
+ }
58
+ export declare function tableToOtsl(table: DoclangTable): string;
59
+ export declare function resolveDraftFieldValue(draft: Record<string, unknown>, fieldKey: string, fieldLabel?: string): unknown;
60
+ export declare function serializeSafetyDocumentToDoclang(input: SafetyDocumentDoclangInput): string;
61
+ export {};
62
+ //# sourceMappingURL=doclang-serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doclang-serializer.d.ts","sourceRoot":"","sources":["../../src/lib/doclang-serializer.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAwB,MAAM,yBAAyB,CAAC;AAiDnG,QAAA,MAAM,kBAAkB,YAAY,CAAC;AACrC,QAAA,MAAM,oBAAoB,cAAc,CAAC;AAuDzC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,kBAAkB,GAAG,OAAO,oBAAoB,CAAC;IACnE,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE,qBAAqB,EAAE,CAAC;IAC/B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD,wBAAwB,EAAE,OAAO,CAAC;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAsKD,wBAAgB,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAqBvD;AAsED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAuBrH;AA2MD,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,0BAA0B,GAAG,MAAM,CA+B1F"}