agentic-domain-document 0.6.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.
Files changed (106) hide show
  1. package/.tbls.yml +201 -0
  2. package/CHANGELOG.md +68 -0
  3. package/README.md +313 -0
  4. package/agent/agent.manifest.json +8 -0
  5. package/agent/capabilities/document-authoring.json +21 -0
  6. package/agent/capabilities/document-block.json +22 -0
  7. package/agent/capabilities/document-toc.json +21 -0
  8. package/agent/capabilities/document-validation.json +21 -0
  9. package/agent/examples/document-quality-examples.md +153 -0
  10. package/agent/examples/examples.md +172 -0
  11. package/agent/guides/10-document-authoring-guide.md +28 -0
  12. package/agent/guides/20-domain-boundary-guide.md +41 -0
  13. package/agent/guides/30-authoring-policy-guide.md +40 -0
  14. package/agent/guides/40-toc-authoring-guide.md +73 -0
  15. package/agent/guides/50-content-block-guide.md +57 -0
  16. package/agent/guides/51-paragraph-authoring-guide.md +68 -0
  17. package/agent/guides/52-table-authoring-guide.md +73 -0
  18. package/agent/guides/53-diagram-figure-authoring-guide.md +75 -0
  19. package/agent/guides/70-korean-writing-style-guide.md +65 -0
  20. package/agent/instructions/00-runtime-behavior.md +17 -0
  21. package/agent/instructions/10-scope-and-boundary.md +27 -0
  22. package/agent/instructions/20-task-procedures.md +69 -0
  23. package/agent/instructions/30-must-and-must-not.md +34 -0
  24. package/agent/resource-index.json +185 -0
  25. package/agent/resource-selection.json +205 -0
  26. package/agent/routing.json +34 -0
  27. package/agent/sources/reference-mapping.md +53 -0
  28. package/agent/validation/document-validation-rules.md +73 -0
  29. package/dist/agent/document-agent-contribution.d.ts +15 -0
  30. package/dist/agent/document-agent-contribution.d.ts.map +1 -0
  31. package/dist/agent/document-agent-contribution.js +39 -0
  32. package/dist/agent/document-agent-contribution.js.map +1 -0
  33. package/dist/agent/index.d.ts +2 -0
  34. package/dist/agent/index.d.ts.map +1 -0
  35. package/dist/agent/index.js +2 -0
  36. package/dist/agent/index.js.map +1 -0
  37. package/dist/database.d.ts +8 -0
  38. package/dist/database.d.ts.map +1 -0
  39. package/dist/database.js +76 -0
  40. package/dist/database.js.map +1 -0
  41. package/dist/index.d.ts +15 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +14 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/markdown-importer.d.ts +14 -0
  46. package/dist/markdown-importer.d.ts.map +1 -0
  47. package/dist/markdown-importer.js +386 -0
  48. package/dist/markdown-importer.js.map +1 -0
  49. package/dist/reader.d.ts +17 -0
  50. package/dist/reader.d.ts.map +1 -0
  51. package/dist/reader.js +332 -0
  52. package/dist/reader.js.map +1 -0
  53. package/dist/repositories.d.ts +118 -0
  54. package/dist/repositories.d.ts.map +1 -0
  55. package/dist/repositories.js +388 -0
  56. package/dist/repositories.js.map +1 -0
  57. package/dist/service.d.ts +35 -0
  58. package/dist/service.d.ts.map +1 -0
  59. package/dist/service.js +327 -0
  60. package/dist/service.js.map +1 -0
  61. package/dist/types.d.ts +276 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +2 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/validators.d.ts +4 -0
  66. package/dist/validators.d.ts.map +1 -0
  67. package/dist/validators.js +255 -0
  68. package/dist/validators.js.map +1 -0
  69. package/docs/build.md +55 -0
  70. package/docs/configuration.md +34 -0
  71. package/docs/delivery.md +50 -0
  72. package/docs/operations.md +50 -0
  73. package/docs/publishing.md +69 -0
  74. package/docs/schema/generated/README.md +30 -0
  75. package/docs/schema/generated/document_annotations.md +119 -0
  76. package/docs/schema/generated/document_annotations.svg +60 -0
  77. package/docs/schema/generated/document_blocks.md +97 -0
  78. package/docs/schema/generated/document_blocks.svg +60 -0
  79. package/docs/schema/generated/document_change_events.md +135 -0
  80. package/docs/schema/generated/document_change_events.svg +88 -0
  81. package/docs/schema/generated/document_code_groups.md +70 -0
  82. package/docs/schema/generated/document_code_groups.svg +52 -0
  83. package/docs/schema/generated/document_codes.md +88 -0
  84. package/docs/schema/generated/document_codes.svg +52 -0
  85. package/docs/schema/generated/document_contents.md +87 -0
  86. package/docs/schema/generated/document_contents.svg +116 -0
  87. package/docs/schema/generated/document_documents.md +126 -0
  88. package/docs/schema/generated/document_documents.svg +222 -0
  89. package/docs/schema/generated/document_node_taxonomies.md +84 -0
  90. package/docs/schema/generated/document_node_taxonomies.svg +80 -0
  91. package/docs/schema/generated/document_node_taxonomy_levels.md +91 -0
  92. package/docs/schema/generated/document_node_taxonomy_levels.svg +52 -0
  93. package/docs/schema/generated/document_nodes.md +120 -0
  94. package/docs/schema/generated/document_nodes.svg +98 -0
  95. package/docs/schema/generated/document_revisions.md +107 -0
  96. package/docs/schema/generated/document_revisions.svg +116 -0
  97. package/docs/schema/generated/document_versions.md +126 -0
  98. package/docs/schema/generated/document_versions.svg +88 -0
  99. package/docs/schema/generated/schema.json +2534 -0
  100. package/docs/schema/generated/schema.mmd +170 -0
  101. package/docs/schema/generated/schema.svg +331 -0
  102. package/docs/schema/migrations.md +40 -0
  103. package/docs/usage.md +332 -0
  104. package/docs/validation-rules.md +69 -0
  105. package/package.json +30 -0
  106. package/src/database/migrations/0001_document_base.sql +753 -0
@@ -0,0 +1,753 @@
1
+ PRAGMA foreign_keys = ON;
2
+
3
+ -- 코드 그룹을 정의한다.
4
+ CREATE TABLE IF NOT EXISTS document_code_groups (
5
+ -- 코드 그룹 식별자
6
+ code_group_code VARCHAR(64) PRIMARY KEY,
7
+
8
+ -- 코드 그룹 한글명
9
+ code_group_name VARCHAR(128) NOT NULL,
10
+
11
+ -- 코드 그룹 설명
12
+ description TEXT,
13
+
14
+ -- 표시 정렬 순서
15
+ sort_order INTEGER NOT NULL DEFAULT 0,
16
+
17
+ -- 활성 여부. 1은 활성, 0은 비활성
18
+ is_active INTEGER NOT NULL DEFAULT 1
19
+ CHECK (is_active IN (0, 1)),
20
+
21
+ -- 생성 시각
22
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
23
+
24
+ -- 수정 시각
25
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
26
+ );
27
+
28
+ -- 코드 그룹별 코드 값을 정의한다.
29
+ CREATE TABLE IF NOT EXISTS document_codes (
30
+ -- 코드 그룹 식별자
31
+ code_group_code VARCHAR(64) NOT NULL,
32
+
33
+ -- 코드 값. lower_snake_case를 사용한다.
34
+ code VARCHAR(128) NOT NULL,
35
+
36
+ -- 코드 한글명
37
+ code_name VARCHAR(128) NOT NULL,
38
+
39
+ -- 코드 설명
40
+ description TEXT,
41
+
42
+ -- 표시 정렬 순서
43
+ sort_order INTEGER NOT NULL DEFAULT 0,
44
+
45
+ -- 활성 여부. 1은 활성, 0은 비활성
46
+ is_active INTEGER NOT NULL DEFAULT 1
47
+ CHECK (is_active IN (0, 1)),
48
+
49
+ -- 확장 메타데이터
50
+ metadata_json JSON
51
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
52
+
53
+ -- 생성 시각
54
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
55
+
56
+ -- 수정 시각
57
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
58
+
59
+ PRIMARY KEY (code_group_code, code),
60
+
61
+ FOREIGN KEY (code_group_code)
62
+ REFERENCES document_code_groups (code_group_code)
63
+ ON DELETE CASCADE
64
+ );
65
+
66
+ -- 문서 유형별 node level 해석 정책을 정의한다.
67
+ CREATE TABLE IF NOT EXISTS document_node_taxonomies (
68
+ -- taxonomy 식별자
69
+ taxonomy_id CHAR(36) PRIMARY KEY
70
+ CHECK (length(taxonomy_id) = 36),
71
+
72
+ -- taxonomy 코드
73
+ taxonomy_code VARCHAR(128) NOT NULL UNIQUE,
74
+
75
+ -- taxonomy 이름
76
+ taxonomy_name VARCHAR(128) NOT NULL,
77
+
78
+ -- 문서 유형 코드
79
+ document_type_code VARCHAR(128) NOT NULL,
80
+
81
+ -- 기본 TOC 포함 level
82
+ default_toc_level_limit INTEGER NOT NULL DEFAULT 3
83
+ CHECK (default_toc_level_limit >= 1),
84
+
85
+ -- 설명
86
+ description TEXT,
87
+
88
+ -- 활성 여부
89
+ is_active INTEGER NOT NULL DEFAULT 1
90
+ CHECK (is_active IN (0, 1)),
91
+
92
+ -- 생성 시각
93
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
94
+
95
+ -- 수정 시각
96
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
97
+ );
98
+
99
+ -- taxonomy별 node level 라벨, 번호 정책, counter scope를 정의한다.
100
+ CREATE TABLE IF NOT EXISTS document_node_taxonomy_levels (
101
+ -- taxonomy level 식별자
102
+ taxonomy_level_id CHAR(36) PRIMARY KEY
103
+ CHECK (length(taxonomy_level_id) = 36),
104
+
105
+ -- taxonomy 식별자
106
+ taxonomy_id CHAR(36) NOT NULL
107
+ CHECK (length(taxonomy_id) = 36),
108
+
109
+ -- node level
110
+ node_level INTEGER NOT NULL
111
+ CHECK (node_level >= 1),
112
+
113
+ -- node label 코드
114
+ node_label_code VARCHAR(128) NOT NULL,
115
+
116
+ -- 번호 정책 코드
117
+ numbering_policy_code VARCHAR(64) NOT NULL,
118
+
119
+ -- 번호 카운터 범위 코드
120
+ counter_scope_code VARCHAR(64) NOT NULL,
121
+
122
+ -- 표시 정렬 순서
123
+ sort_order INTEGER NOT NULL DEFAULT 0,
124
+
125
+ -- 생성 시각
126
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
127
+
128
+ -- 수정 시각
129
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
130
+
131
+ FOREIGN KEY (taxonomy_id)
132
+ REFERENCES document_node_taxonomies (taxonomy_id)
133
+ ON DELETE CASCADE,
134
+
135
+ UNIQUE (taxonomy_id, node_level)
136
+ );
137
+
138
+ -- 문서 단위 메타데이터, 작성자, taxonomy, 상태를 관리한다.
139
+ CREATE TABLE IF NOT EXISTS document_documents (
140
+ -- 문서 식별자
141
+ document_id CHAR(36) PRIMARY KEY
142
+ CHECK (length(document_id) = 36),
143
+
144
+ -- 문서 유형 코드
145
+ document_type_code VARCHAR(128) NOT NULL,
146
+
147
+ -- 적용 taxonomy 식별자
148
+ taxonomy_id CHAR(36) NOT NULL
149
+ CHECK (length(taxonomy_id) = 36),
150
+
151
+ -- 문서 제목
152
+ title VARCHAR(512) NOT NULL,
153
+
154
+ -- 파생 원본 문서 식별자
155
+ source_document_id CHAR(36)
156
+ CHECK (source_document_id IS NULL OR length(source_document_id) = 36),
157
+
158
+ -- 표시 버전
159
+ version_label VARCHAR(64),
160
+
161
+ -- 작성자 유형
162
+ author_type_code VARCHAR(32) NOT NULL DEFAULT 'user'
163
+ CHECK (author_type_code IN ('user', 'agent', 'system')),
164
+
165
+ -- 작성자 식별자
166
+ author_id VARCHAR(128),
167
+
168
+ -- 작성자 표시명
169
+ author_name VARCHAR(128),
170
+
171
+ -- 문서 상태
172
+ status_code VARCHAR(32) NOT NULL DEFAULT 'draft'
173
+ CHECK (status_code IN ('draft', 'in_review', 'approved', 'published', 'archived')),
174
+
175
+ -- TOC로 취급할 level limit
176
+ toc_level_limit INTEGER NOT NULL DEFAULT 3
177
+ CHECK (toc_level_limit >= 1),
178
+
179
+ -- published 상태 전환 시각
180
+ published_at DATETIME,
181
+
182
+ -- 생성 시각
183
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
184
+
185
+ -- 수정 시각
186
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
187
+
188
+ -- 확장 메타데이터
189
+ metadata_json JSON
190
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
191
+
192
+ FOREIGN KEY (taxonomy_id)
193
+ REFERENCES document_node_taxonomies (taxonomy_id),
194
+
195
+ FOREIGN KEY (source_document_id)
196
+ REFERENCES document_documents (document_id)
197
+ ON DELETE SET NULL
198
+ );
199
+
200
+ -- 문서의 계층 node tree를 관리한다.
201
+ CREATE TABLE IF NOT EXISTS document_nodes (
202
+ -- 노드 식별자
203
+ node_id CHAR(36) PRIMARY KEY
204
+ CHECK (length(node_id) = 36),
205
+
206
+ -- 소속 문서 식별자
207
+ document_id CHAR(36) NOT NULL
208
+ CHECK (length(document_id) = 36),
209
+
210
+ -- 상위 노드 식별자
211
+ parent_node_id CHAR(36)
212
+ CHECK (parent_node_id IS NULL OR length(parent_node_id) = 36),
213
+
214
+ -- node level
215
+ node_level INTEGER NOT NULL
216
+ CHECK (node_level >= 1),
217
+
218
+ -- 노드 역할 코드
219
+ node_role_code VARCHAR(64) NOT NULL DEFAULT 'body',
220
+
221
+ -- 노드 제목
222
+ title VARCHAR(512) NOT NULL,
223
+
224
+ -- TOC 표시 정책
225
+ toc_visibility VARCHAR(16) NOT NULL DEFAULT 'inherit'
226
+ CHECK (toc_visibility IN ('inherit', 'include', 'exclude')),
227
+
228
+ -- 번호 정책 코드
229
+ numbering_policy_code VARCHAR(64) NOT NULL DEFAULT 'inherit',
230
+
231
+ -- 수동 번호 override
232
+ numbering_override VARCHAR(64),
233
+
234
+ -- 형제 노드 내 정렬 순서
235
+ sort_order INTEGER NOT NULL DEFAULT 0,
236
+
237
+ -- 생성 시각
238
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
239
+
240
+ -- 수정 시각
241
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
242
+
243
+ -- 확장 메타데이터
244
+ metadata_json JSON
245
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
246
+
247
+ FOREIGN KEY (document_id)
248
+ REFERENCES document_documents (document_id)
249
+ ON DELETE CASCADE,
250
+
251
+ FOREIGN KEY (parent_node_id)
252
+ REFERENCES document_nodes (node_id)
253
+ ON DELETE CASCADE,
254
+
255
+ UNIQUE (document_id, parent_node_id, sort_order)
256
+ );
257
+
258
+ -- 특정 document node에 붙는 block collection을 관리한다.
259
+ CREATE TABLE IF NOT EXISTS document_contents (
260
+ -- content 식별자
261
+ content_id CHAR(36) PRIMARY KEY
262
+ CHECK (length(content_id) = 36),
263
+
264
+ -- 소속 문서 식별자
265
+ document_id CHAR(36) NOT NULL
266
+ CHECK (length(document_id) = 36),
267
+
268
+ -- 소속 노드 식별자
269
+ node_id CHAR(36) NOT NULL
270
+ CHECK (length(node_id) = 36),
271
+
272
+ -- 생성 시각
273
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
274
+
275
+ -- 수정 시각
276
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
277
+
278
+ -- 확장 메타데이터
279
+ metadata_json JSON
280
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
281
+
282
+ FOREIGN KEY (document_id)
283
+ REFERENCES document_documents (document_id)
284
+ ON DELETE CASCADE,
285
+
286
+ FOREIGN KEY (node_id)
287
+ REFERENCES document_nodes (node_id)
288
+ ON DELETE CASCADE,
289
+
290
+ UNIQUE (node_id)
291
+ );
292
+
293
+ -- 문서 본문 표현 block을 관리한다.
294
+ CREATE TABLE IF NOT EXISTS document_blocks (
295
+ -- block 식별자
296
+ block_id CHAR(36) PRIMARY KEY
297
+ CHECK (length(block_id) = 36),
298
+
299
+ -- 소속 content 식별자
300
+ content_id CHAR(36) NOT NULL
301
+ CHECK (length(content_id) = 36),
302
+
303
+ -- block 유형 코드
304
+ block_type_code VARCHAR(32) NOT NULL,
305
+
306
+ -- content 안에서의 순서
307
+ sort_order INTEGER NOT NULL DEFAULT 0,
308
+
309
+ -- 텍스트 중심 block 본문
310
+ content_text TEXT,
311
+
312
+ -- 구조형 block payload
313
+ content_json JSON
314
+ CHECK (content_json IS NULL OR json_valid(content_json)),
315
+
316
+ -- 생성 시각
317
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
318
+
319
+ -- 수정 시각
320
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
321
+
322
+ -- 확장 메타데이터
323
+ metadata_json JSON
324
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
325
+
326
+ FOREIGN KEY (content_id)
327
+ REFERENCES document_contents (content_id)
328
+ ON DELETE CASCADE,
329
+
330
+ UNIQUE (content_id, sort_order),
331
+
332
+ CHECK (content_text IS NOT NULL OR content_json IS NOT NULL)
333
+ );
334
+
335
+ -- 문서 본문 밖의 note annotation을 관리한다.
336
+ CREATE TABLE IF NOT EXISTS document_annotations (
337
+ -- annotation 식별자
338
+ annotation_id CHAR(36) PRIMARY KEY
339
+ CHECK (length(annotation_id) = 36),
340
+
341
+ -- 소속 문서 식별자
342
+ document_id CHAR(36) NOT NULL
343
+ CHECK (length(document_id) = 36),
344
+
345
+ -- annotation 대상 유형
346
+ target_type_code VARCHAR(32) NOT NULL
347
+ CHECK (target_type_code IN ('document', 'node', 'content', 'block')),
348
+
349
+ -- annotation 대상 식별자
350
+ target_id CHAR(36) NOT NULL
351
+ CHECK (length(target_id) = 36),
352
+
353
+ -- annotation 유형
354
+ annotation_type_code VARCHAR(32) NOT NULL DEFAULT 'note'
355
+ CHECK (annotation_type_code = 'note'),
356
+
357
+ -- annotation 상태
358
+ status_code VARCHAR(32) NOT NULL DEFAULT 'open'
359
+ CHECK (status_code IN ('open', 'resolved')),
360
+
361
+ -- note 내용
362
+ note_text TEXT NOT NULL,
363
+
364
+ -- 작성자 유형
365
+ author_type_code VARCHAR(32) NOT NULL DEFAULT 'user'
366
+ CHECK (author_type_code IN ('user', 'agent', 'system')),
367
+
368
+ -- 작성자 식별자
369
+ author_id VARCHAR(128),
370
+
371
+ -- 작성자 표시명
372
+ author_name VARCHAR(128),
373
+
374
+ -- 해결 시각
375
+ resolved_at DATETIME,
376
+
377
+ -- 생성 시각
378
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
379
+
380
+ -- 수정 시각
381
+ updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
382
+
383
+ -- 확장 메타데이터
384
+ metadata_json JSON
385
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
386
+
387
+ FOREIGN KEY (document_id)
388
+ REFERENCES document_documents (document_id)
389
+ ON DELETE CASCADE
390
+ );
391
+
392
+ -- 하나 이상의 변경 이벤트를 묶는 의미 있는 변경 단위를 관리한다.
393
+ CREATE TABLE IF NOT EXISTS document_revisions (
394
+ -- revision 식별자
395
+ revision_id CHAR(36) PRIMARY KEY
396
+ CHECK (length(revision_id) = 36),
397
+
398
+ -- 소속 문서 식별자
399
+ document_id CHAR(36) NOT NULL
400
+ CHECK (length(document_id) = 36),
401
+
402
+ -- 문서별 revision 순번
403
+ revision_no INTEGER NOT NULL
404
+ CHECK (revision_no >= 1),
405
+
406
+ -- revision 제목
407
+ revision_title VARCHAR(256) NOT NULL,
408
+
409
+ -- revision 사유
410
+ revision_reason TEXT,
411
+
412
+ -- revision 생성 당시 문서 상태
413
+ document_status_code VARCHAR(32) NOT NULL
414
+ CHECK (document_status_code IN ('in_review', 'approved', 'published', 'archived')),
415
+
416
+ -- revision 생성자 유형
417
+ created_by_type_code VARCHAR(32) NOT NULL DEFAULT 'user'
418
+ CHECK (created_by_type_code IN ('user', 'agent', 'system')),
419
+
420
+ -- revision 생성자 식별자
421
+ created_by_id VARCHAR(128),
422
+
423
+ -- revision 생성자 표시명
424
+ created_by_name VARCHAR(128),
425
+
426
+ -- 생성 시각
427
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
428
+
429
+ -- revision 요약/확장 메타데이터
430
+ metadata_json JSON
431
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
432
+
433
+ FOREIGN KEY (document_id)
434
+ REFERENCES document_documents (document_id)
435
+ ON DELETE CASCADE,
436
+
437
+ UNIQUE (document_id, revision_no)
438
+ );
439
+
440
+ -- revision에 속하는 로그성 변경 이벤트를 관리한다.
441
+ CREATE TABLE IF NOT EXISTS document_change_events (
442
+ -- event 식별자
443
+ event_id CHAR(36) PRIMARY KEY
444
+ CHECK (length(event_id) = 36),
445
+
446
+ -- 소속 revision 식별자
447
+ revision_id CHAR(36) NOT NULL
448
+ CHECK (length(revision_id) = 36),
449
+
450
+ -- 소속 문서 식별자
451
+ document_id CHAR(36) NOT NULL
452
+ CHECK (length(document_id) = 36),
453
+
454
+ -- revision 안에서의 event 순서
455
+ sequence_no INTEGER NOT NULL
456
+ CHECK (sequence_no >= 1),
457
+
458
+ -- 변경 대상 유형
459
+ target_type_code VARCHAR(32) NOT NULL
460
+ CHECK (target_type_code IN ('document', 'node', 'content', 'block', 'annotation')),
461
+
462
+ -- 변경 대상 식별자
463
+ target_id CHAR(36) NOT NULL
464
+ CHECK (length(target_id) = 36),
465
+
466
+ -- 변경 유형
467
+ change_type_code VARCHAR(64) NOT NULL
468
+ CHECK (change_type_code IN (
469
+ 'created',
470
+ 'updated',
471
+ 'deleted',
472
+ 'status_changed',
473
+ 'reordered',
474
+ 'annotated',
475
+ 'version_created',
476
+ 'new_draft_created'
477
+ )),
478
+
479
+ -- 개별 변경 사유
480
+ change_reason TEXT,
481
+
482
+ -- 변경자 유형
483
+ changed_by_type_code VARCHAR(32) NOT NULL DEFAULT 'user'
484
+ CHECK (changed_by_type_code IN ('user', 'agent', 'system')),
485
+
486
+ -- 변경자 식별자
487
+ changed_by_id VARCHAR(128),
488
+
489
+ -- 변경자 표시명
490
+ changed_by_name VARCHAR(128),
491
+
492
+ -- 변경 시각
493
+ changed_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
494
+
495
+ -- before/after preview 등 이벤트 메타데이터
496
+ metadata_json JSON
497
+ CHECK (metadata_json IS NULL OR json_valid(metadata_json)),
498
+
499
+ FOREIGN KEY (revision_id)
500
+ REFERENCES document_revisions (revision_id)
501
+ ON DELETE CASCADE,
502
+
503
+ FOREIGN KEY (document_id)
504
+ REFERENCES document_documents (document_id)
505
+ ON DELETE CASCADE,
506
+
507
+ UNIQUE (revision_id, sequence_no)
508
+ );
509
+
510
+ -- 검토/승인/배포 기준본 snapshot을 관리한다.
511
+ CREATE TABLE IF NOT EXISTS document_versions (
512
+ -- version 식별자
513
+ version_id CHAR(36) PRIMARY KEY
514
+ CHECK (length(version_id) = 36),
515
+
516
+ -- 소속 문서 식별자
517
+ document_id CHAR(36) NOT NULL
518
+ CHECK (length(document_id) = 36),
519
+
520
+ -- 기준 revision 식별자
521
+ revision_id CHAR(36) NOT NULL
522
+ CHECK (length(revision_id) = 36),
523
+
524
+ -- 문서별 version 순번
525
+ version_no INTEGER NOT NULL
526
+ CHECK (version_no >= 1),
527
+
528
+ -- 표시 버전
529
+ version_label VARCHAR(64),
530
+
531
+ -- snapshot 유형
532
+ snapshot_type_code VARCHAR(32) NOT NULL
533
+ CHECK (snapshot_type_code IN ('review', 'approval', 'publication', 'manual')),
534
+
535
+ -- snapshot 당시 문서 상태
536
+ document_status_code VARCHAR(32) NOT NULL
537
+ CHECK (document_status_code IN ('in_review', 'approved', 'published', 'archived')),
538
+
539
+ -- 작은 snapshot 또는 manifest
540
+ snapshot_json JSON
541
+ CHECK (snapshot_json IS NULL OR json_valid(snapshot_json)),
542
+
543
+ -- snapshot checksum
544
+ checksum CHAR(64)
545
+ CHECK (checksum IS NULL OR length(checksum) = 64),
546
+
547
+ -- 생성자 유형
548
+ created_by_type_code VARCHAR(32) NOT NULL DEFAULT 'user'
549
+ CHECK (created_by_type_code IN ('user', 'agent', 'system')),
550
+
551
+ -- 생성자 식별자
552
+ created_by_id VARCHAR(128),
553
+
554
+ -- 생성자 표시명
555
+ created_by_name VARCHAR(128),
556
+
557
+ -- 생성 시각
558
+ created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
559
+
560
+ FOREIGN KEY (document_id)
561
+ REFERENCES document_documents (document_id)
562
+ ON DELETE CASCADE,
563
+
564
+ FOREIGN KEY (revision_id)
565
+ REFERENCES document_revisions (revision_id)
566
+ ON DELETE CASCADE,
567
+
568
+ UNIQUE (document_id, version_no)
569
+ );
570
+
571
+ CREATE INDEX IF NOT EXISTS idx_document_documents_type_status
572
+ ON document_documents (document_type_code, status_code);
573
+
574
+ CREATE INDEX IF NOT EXISTS idx_document_documents_taxonomy
575
+ ON document_documents (taxonomy_id);
576
+
577
+ CREATE INDEX IF NOT EXISTS idx_document_documents_source
578
+ ON document_documents (source_document_id);
579
+
580
+ CREATE INDEX IF NOT EXISTS idx_document_nodes_document_parent_order
581
+ ON document_nodes (document_id, parent_node_id, sort_order);
582
+
583
+ CREATE INDEX IF NOT EXISTS idx_document_nodes_document_level_order
584
+ ON document_nodes (document_id, node_level, sort_order);
585
+
586
+ CREATE INDEX IF NOT EXISTS idx_document_contents_document
587
+ ON document_contents (document_id);
588
+
589
+ CREATE INDEX IF NOT EXISTS idx_document_blocks_content_order
590
+ ON document_blocks (content_id, sort_order);
591
+
592
+ CREATE INDEX IF NOT EXISTS idx_document_annotations_target
593
+ ON document_annotations (document_id, target_type_code, target_id);
594
+
595
+ CREATE INDEX IF NOT EXISTS idx_document_annotations_status
596
+ ON document_annotations (document_id, status_code);
597
+
598
+ CREATE INDEX IF NOT EXISTS idx_document_revisions_status
599
+ ON document_revisions (document_id, document_status_code);
600
+
601
+ CREATE INDEX IF NOT EXISTS idx_document_revisions_created_at
602
+ ON document_revisions (document_id, created_at);
603
+
604
+ CREATE INDEX IF NOT EXISTS idx_document_change_events_target
605
+ ON document_change_events (document_id, target_type_code, target_id);
606
+
607
+ CREATE INDEX IF NOT EXISTS idx_document_change_events_changed_at
608
+ ON document_change_events (document_id, changed_at);
609
+
610
+ CREATE INDEX IF NOT EXISTS idx_document_versions_revision
611
+ ON document_versions (revision_id);
612
+
613
+ CREATE INDEX IF NOT EXISTS idx_document_versions_type
614
+ ON document_versions (document_id, snapshot_type_code);
615
+
616
+ INSERT INTO document_code_groups (code_group_code, code_group_name, description, sort_order)
617
+ VALUES
618
+ ('document_type', '문서 유형', '기본 문서, 아키텍처 명세서 등 문서 유형을 구분한다.', 10),
619
+ ('node_label', '노드 라벨', '문서 node level의 표시 의미를 정의한다.', 20),
620
+ ('node_role', '노드 역할', 'front matter, body, appendix 등 문서 내 node 역할을 정의한다.', 30),
621
+ ('toc_visibility', '목차 표시 정책', 'node의 TOC 포함, 제외, 상속 정책을 정의한다.', 40),
622
+ ('numbering_policy', '번호 정책', '문서 node와 caption 번호 정책을 정의한다.', 50),
623
+ ('counter_scope', '번호 카운터 범위', '번호 카운터가 문서 전체 또는 parent 기준인지 정의한다.', 60),
624
+ ('block_type', '블록 유형', '문서 본문 block 유형을 정의한다.', 70),
625
+ ('document_status', '문서 상태', '문서 작성, 검토, 승인, 배포, 보관 상태를 정의한다.', 80),
626
+ ('annotation_type', 'Annotation 유형', '본문 밖 부가 annotation 유형을 정의한다.', 90),
627
+ ('annotation_status', 'Annotation 상태', 'annotation 처리 상태를 정의한다.', 100),
628
+ ('actor_type', '행위자 유형', 'user, agent, system 행위자 유형을 정의한다.', 110),
629
+ ('revision_target_type', '변경 대상 유형', 'change event 대상 유형을 정의한다.', 120),
630
+ ('revision_change_type', '변경 유형', 'change event 유형을 정의한다.', 130),
631
+ ('snapshot_type', 'Snapshot 유형', 'version snapshot 유형을 정의한다.', 140)
632
+ ON CONFLICT(code_group_code) DO UPDATE SET
633
+ code_group_name = excluded.code_group_name,
634
+ description = excluded.description,
635
+ sort_order = excluded.sort_order,
636
+ updated_at = CURRENT_TIMESTAMP;
637
+
638
+ INSERT INTO document_codes (code_group_code, code, code_name, description, sort_order, metadata_json)
639
+ VALUES
640
+ ('document_type', 'default', '기본 문서', '일반 문서 기본 유형이다.', 10, NULL),
641
+ ('document_type', 'architecture_specification', '아키텍처 명세서', '대형 아키텍처 명세서 문서 유형이다.', 20, NULL),
642
+ ('node_label', 'part', '부', 'Part level label이다.', 10, '{"display_label":"Part"}'),
643
+ ('node_label', 'chapter', '장', 'Chapter level label이다.', 20, '{"display_label":"Chapter"}'),
644
+ ('node_label', 'section', '절', 'Section level label이다.', 30, '{"display_label":"Section"}'),
645
+ ('node_label', 'subsection', '항', 'Subsection level label이다.', 40, '{"display_label":"Subsection"}'),
646
+ ('node_label', 'heading', '제목', 'Heading level label이다.', 50, '{"display_label":"Heading"}'),
647
+ ('node_label', 'subheading', '하위 제목', 'Subheading level label이다.', 60, '{"display_label":"Subheading"}'),
648
+ ('node_label', 'detail', '세부', 'Detail level label이다.', 70, '{"display_label":"Detail"}'),
649
+ ('node_role', 'front_matter', '전면부', '문서 개요, 변경 이력, 용어 정의 등 전면부 node다.', 10, NULL),
650
+ ('node_role', 'body', '본문', '문서 본문 node다.', 20, NULL),
651
+ ('node_role', 'appendix', '부록', '문서 부록 node다.', 30, NULL),
652
+ ('node_role', 'back_matter', '후면부', '참고문헌 등 후면부 node다.', 40, NULL),
653
+ ('toc_visibility', 'inherit', '상속', '기본 TOC 정책을 상속한다.', 10, NULL),
654
+ ('toc_visibility', 'include', '포함', 'TOC에 포함한다.', 20, NULL),
655
+ ('toc_visibility', 'exclude', '제외', 'TOC에서 제외한다.', 30, NULL),
656
+ ('numbering_policy', 'inherit', '상속', '상위 또는 taxonomy 번호 정책을 상속한다.', 10, NULL),
657
+ ('numbering_policy', 'none', '없음', '번호를 부여하지 않는다.', 20, NULL),
658
+ ('numbering_policy', 'decimal', '십진수', '1, 2, 3 형태의 번호를 사용한다.', 30, NULL),
659
+ ('numbering_policy', 'roman_upper', '대문자 로마자', 'I, II, III 형태의 번호를 사용한다.', 40, NULL),
660
+ ('numbering_policy', 'alpha_upper', '대문자 알파벳', 'A, B, C 형태의 번호를 사용한다.', 50, NULL),
661
+ ('numbering_policy', 'custom', '사용자 정의', '사용자 정의 번호를 사용한다.', 60, NULL),
662
+ ('counter_scope', 'document', '문서 기준', '문서 전체 기준으로 번호를 계산한다.', 10, NULL),
663
+ ('counter_scope', 'parent', '상위 기준', '상위 node 기준으로 번호를 계산한다.', 20, NULL),
664
+ ('block_type', 'paragraph', '문단', '일반 문단 block이다.', 10, NULL),
665
+ ('block_type', 'quote', '인용', '인용문 block이다.', 20, NULL),
666
+ ('block_type', 'table', '표', '표 block이다.', 30, NULL),
667
+ ('block_type', 'figure', '그림', '그림 또는 이미지 block이다.', 40, NULL),
668
+ ('block_type', 'diagram', '다이어그램', '다이어그램 block이다.', 50, NULL),
669
+ ('block_type', 'list', '목록', '목록 block이다.', 60, NULL),
670
+ ('block_type', 'code', '코드', '코드 block이다.', 70, NULL),
671
+ ('block_type', 'callout', '콜아웃', '강조/참고 block이다.', 80, NULL),
672
+ ('document_status', 'draft', '작성 중', '작성 중인 draft 상태다.', 10, NULL),
673
+ ('document_status', 'in_review', '검토 중', '검토 기준본 이후 검토 중 상태다.', 20, NULL),
674
+ ('document_status', 'approved', '승인 완료', '승인 완료 상태다.', 30, NULL),
675
+ ('document_status', 'published', '배포 완료', '배포 완료 상태다.', 40, NULL),
676
+ ('document_status', 'archived', '보관', '보관 상태다.', 50, NULL),
677
+ ('annotation_type', 'note', '노트', '본문 밖 부가 note다.', 10, NULL),
678
+ ('annotation_status', 'open', '열림', '처리되지 않은 annotation이다.', 10, NULL),
679
+ ('annotation_status', 'resolved', '해결', '해결된 annotation이다.', 20, NULL),
680
+ ('actor_type', 'user', '사용자', '사람 사용자다.', 10, NULL),
681
+ ('actor_type', 'agent', 'Agent', 'AI agent다.', 20, NULL),
682
+ ('actor_type', 'system', '시스템', '시스템 처리 주체다.', 30, NULL),
683
+ ('revision_target_type', 'document', '문서', '문서를 대상으로 한다.', 10, NULL),
684
+ ('revision_target_type', 'node', '노드', '문서 node를 대상으로 한다.', 20, NULL),
685
+ ('revision_target_type', 'content', 'Content', 'content를 대상으로 한다.', 30, NULL),
686
+ ('revision_target_type', 'block', 'Block', 'block을 대상으로 한다.', 40, NULL),
687
+ ('revision_target_type', 'annotation', 'Annotation', 'annotation을 대상으로 한다.', 50, NULL),
688
+ ('revision_change_type', 'created', '생성', '대상이 생성되었다.', 10, NULL),
689
+ ('revision_change_type', 'updated', '수정', '대상이 수정되었다.', 20, NULL),
690
+ ('revision_change_type', 'deleted', '삭제', '대상이 삭제되었다.', 30, NULL),
691
+ ('revision_change_type', 'status_changed', '상태 변경', '상태가 변경되었다.', 40, NULL),
692
+ ('revision_change_type', 'reordered', '순서 변경', '순서가 변경되었다.', 50, NULL),
693
+ ('revision_change_type', 'annotated', 'Annotation', 'annotation이 추가 또는 처리되었다.', 60, NULL),
694
+ ('revision_change_type', 'version_created', 'Version 생성', 'version snapshot이 생성되었다.', 70, NULL),
695
+ ('revision_change_type', 'new_draft_created', '새 Draft 생성', '기준 문서에서 새 draft가 파생되었다.', 80, NULL),
696
+ ('snapshot_type', 'review', '검토 기준본', '검토 요청 시점의 기준본이다.', 10, NULL),
697
+ ('snapshot_type', 'approval', '승인 기준본', '승인 시점의 기준본이다.', 20, NULL),
698
+ ('snapshot_type', 'publication', '배포 기준본', '배포 시점의 기준본이다.', 30, NULL),
699
+ ('snapshot_type', 'manual', '수동 기준본', '사용자가 수동 생성한 기준본이다.', 40, NULL)
700
+ ON CONFLICT(code_group_code, code) DO UPDATE SET
701
+ code_name = excluded.code_name,
702
+ description = excluded.description,
703
+ sort_order = excluded.sort_order,
704
+ metadata_json = excluded.metadata_json,
705
+ updated_at = CURRENT_TIMESTAMP;
706
+
707
+ INSERT INTO document_node_taxonomies (
708
+ taxonomy_id,
709
+ taxonomy_code,
710
+ taxonomy_name,
711
+ document_type_code,
712
+ default_toc_level_limit,
713
+ description
714
+ )
715
+ VALUES
716
+ ('11111111-1111-4111-8111-111111111111', 'default', '기본 문서 구조', 'default', 3, 'Chapter, Section, Subsection 중심의 기본 문서 구조다.'),
717
+ ('22222222-2222-4222-8222-222222222222', 'architecture_specification', '아키텍처 명세서 문서 구조', 'architecture_specification', 4, 'Part, Chapter, Section, Subsection 중심의 아키텍처 명세서 구조다.')
718
+ ON CONFLICT(taxonomy_code) DO UPDATE SET
719
+ taxonomy_name = excluded.taxonomy_name,
720
+ document_type_code = excluded.document_type_code,
721
+ default_toc_level_limit = excluded.default_toc_level_limit,
722
+ description = excluded.description,
723
+ updated_at = CURRENT_TIMESTAMP;
724
+
725
+ INSERT INTO document_node_taxonomy_levels (
726
+ taxonomy_level_id,
727
+ taxonomy_id,
728
+ node_level,
729
+ node_label_code,
730
+ numbering_policy_code,
731
+ counter_scope_code,
732
+ sort_order
733
+ )
734
+ VALUES
735
+ ('11111111-1111-4111-8111-111111111101', '11111111-1111-4111-8111-111111111111', 1, 'chapter', 'decimal', 'document', 10),
736
+ ('11111111-1111-4111-8111-111111111102', '11111111-1111-4111-8111-111111111111', 2, 'section', 'inherit', 'parent', 20),
737
+ ('11111111-1111-4111-8111-111111111103', '11111111-1111-4111-8111-111111111111', 3, 'subsection', 'inherit', 'parent', 30),
738
+ ('11111111-1111-4111-8111-111111111104', '11111111-1111-4111-8111-111111111111', 4, 'heading', 'inherit', 'parent', 40),
739
+ ('11111111-1111-4111-8111-111111111105', '11111111-1111-4111-8111-111111111111', 5, 'subheading', 'inherit', 'parent', 50),
740
+ ('11111111-1111-4111-8111-111111111106', '11111111-1111-4111-8111-111111111111', 6, 'detail', 'inherit', 'parent', 60),
741
+ ('22222222-2222-4222-8222-222222222201', '22222222-2222-4222-8222-222222222222', 1, 'part', 'roman_upper', 'document', 10),
742
+ ('22222222-2222-4222-8222-222222222202', '22222222-2222-4222-8222-222222222222', 2, 'chapter', 'decimal', 'document', 20),
743
+ ('22222222-2222-4222-8222-222222222203', '22222222-2222-4222-8222-222222222222', 3, 'section', 'inherit', 'parent', 30),
744
+ ('22222222-2222-4222-8222-222222222204', '22222222-2222-4222-8222-222222222222', 4, 'subsection', 'inherit', 'parent', 40),
745
+ ('22222222-2222-4222-8222-222222222205', '22222222-2222-4222-8222-222222222222', 5, 'heading', 'inherit', 'parent', 50),
746
+ ('22222222-2222-4222-8222-222222222206', '22222222-2222-4222-8222-222222222222', 6, 'subheading', 'inherit', 'parent', 60),
747
+ ('22222222-2222-4222-8222-222222222207', '22222222-2222-4222-8222-222222222222', 7, 'detail', 'inherit', 'parent', 70)
748
+ ON CONFLICT(taxonomy_id, node_level) DO UPDATE SET
749
+ node_label_code = excluded.node_label_code,
750
+ numbering_policy_code = excluded.numbering_policy_code,
751
+ counter_scope_code = excluded.counter_scope_code,
752
+ sort_order = excluded.sort_order,
753
+ updated_at = CURRENT_TIMESTAMP;