db-teigisho 0.1.0__tar.gz

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 (35) hide show
  1. db_teigisho-0.1.0/.gitignore +13 -0
  2. db_teigisho-0.1.0/PKG-INFO +233 -0
  3. db_teigisho-0.1.0/README.md +196 -0
  4. db_teigisho-0.1.0/examples/database-definition.yaml +117 -0
  5. db_teigisho-0.1.0/pyproject.toml +74 -0
  6. db_teigisho-0.1.0/schemas/db-definition.schema.json +571 -0
  7. db_teigisho-0.1.0/src/db_teigisho/__init__.py +3 -0
  8. db_teigisho-0.1.0/src/db_teigisho/__main__.py +5 -0
  9. db_teigisho-0.1.0/src/db_teigisho/assets/NotoSansJP[wght].ttf +0 -0
  10. db_teigisho-0.1.0/src/db_teigisho/assets/OFL.txt +93 -0
  11. db_teigisho-0.1.0/src/db_teigisho/cli.py +127 -0
  12. db_teigisho-0.1.0/src/db_teigisho/codex_hook.py +89 -0
  13. db_teigisho-0.1.0/src/db_teigisho/copilot_hook.py +112 -0
  14. db_teigisho-0.1.0/src/db_teigisho/diagram_render.py +119 -0
  15. db_teigisho-0.1.0/src/db_teigisho/er.py +103 -0
  16. db_teigisho-0.1.0/src/db_teigisho/er_graph.py +341 -0
  17. db_teigisho-0.1.0/src/db_teigisho/errors.py +40 -0
  18. db_teigisho-0.1.0/src/db_teigisho/loader.py +108 -0
  19. db_teigisho-0.1.0/src/db_teigisho/models.py +128 -0
  20. db_teigisho-0.1.0/src/db_teigisho/py.typed +1 -0
  21. db_teigisho-0.1.0/src/db_teigisho/render.py +840 -0
  22. db_teigisho-0.1.0/src/db_teigisho/schema.py +39 -0
  23. db_teigisho-0.1.0/src/db_teigisho/templates/definition.html.j2 +294 -0
  24. db_teigisho-0.1.0/src/db_teigisho/templates/er_auto_layout.css +5 -0
  25. db_teigisho-0.1.0/src/db_teigisho/templates/er_auto_layout.js +328 -0
  26. db_teigisho-0.1.0/src/db_teigisho/templates/er_details.css +69 -0
  27. db_teigisho-0.1.0/src/db_teigisho/templates/er_details.js +446 -0
  28. db_teigisho-0.1.0/src/db_teigisho/templates/er_edge_routing.css +24 -0
  29. db_teigisho-0.1.0/src/db_teigisho/templates/er_edge_routing.js +1048 -0
  30. db_teigisho-0.1.0/src/db_teigisho/templates/er_layout.css +5 -0
  31. db_teigisho-0.1.0/src/db_teigisho/templates/er_layout.js +414 -0
  32. db_teigisho-0.1.0/src/db_teigisho/templates/er_maximize.css +31 -0
  33. db_teigisho-0.1.0/src/db_teigisho/templates/er_maximize.js +76 -0
  34. db_teigisho-0.1.0/src/db_teigisho/templates/er_viewer.js +604 -0
  35. db_teigisho-0.1.0/src/db_teigisho/validation.py +205 -0
@@ -0,0 +1,13 @@
1
+ .venv/
2
+ node_modules/
3
+ .coverage
4
+ htmlcov/
5
+ __pycache__/
6
+ *.py[cod]
7
+ .pytest_cache/
8
+ .mypy_cache/
9
+ .ruff_cache/
10
+ dist/
11
+ build/
12
+ tmp/
13
+ .DS_Store
@@ -0,0 +1,233 @@
1
+ Metadata-Version: 2.5
2
+ Name: db-teigisho
3
+ Version: 0.1.0
4
+ Summary: YAML-first database definition validation and publishing
5
+ Project-URL: Homepage, https://github.com/dse-corp/db-teigisho
6
+ Project-URL: Repository, https://github.com/dse-corp/db-teigisho
7
+ Project-URL: Issues, https://github.com/dse-corp/db-teigisho/issues
8
+ Author: dse-corp
9
+ License: MIT
10
+ Keywords: cli,database,database-definition,schema,yaml
11
+ Classifier: Development Status :: 3 - Alpha
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Database
20
+ Requires-Python: >=3.11
21
+ Requires-Dist: jinja2<4,>=3.1
22
+ Requires-Dist: openpyxl<4,>=3.1
23
+ Requires-Dist: pillow<12,>=11.2
24
+ Requires-Dist: pydantic<3,>=2.11
25
+ Requires-Dist: pyyaml<7,>=6.0
26
+ Requires-Dist: reportlab<5,>=4.4
27
+ Provides-Extra: dev
28
+ Requires-Dist: build<2,>=1.2; extra == 'dev'
29
+ Requires-Dist: mypy<2,>=1.15; extra == 'dev'
30
+ Requires-Dist: pytest-cov<7,>=6.1; extra == 'dev'
31
+ Requires-Dist: pytest<9,>=8.3; extra == 'dev'
32
+ Requires-Dist: ruff<1,>=0.11; extra == 'dev'
33
+ Requires-Dist: types-openpyxl<4,>=3.1; extra == 'dev'
34
+ Requires-Dist: types-pyyaml<7,>=6.0; extra == 'dev'
35
+ Requires-Dist: types-reportlab<5,>=4.4; extra == 'dev'
36
+ Description-Content-Type: text/markdown
37
+
38
+ # db-teigisho
39
+
40
+ Excelで管理していたテーブル定義書を、AIと人間の双方が扱いやすいYAML-firstの成果物へ
41
+ 置き換えるPythonツールです。YAMLをSingle Source of Truth(SSOT)とし、JSON Schema、
42
+ 意味検証、HTML・Excel・PDF、CI向けmanifestを同じ定義から生成します。
43
+
44
+ ## CLIとして利用
45
+
46
+ PyPIからインストールして、`dbdef`コマンドを利用できます。
47
+
48
+ ```bash
49
+ pipx install db-teigisho
50
+ dbdef --version
51
+ dbdef validate path/to/definition.yaml
52
+ ```
53
+
54
+ 更新・削除は次のコマンドで行います。
55
+
56
+ ```bash
57
+ pipx upgrade db-teigisho
58
+ pipx uninstall db-teigisho
59
+ ```
60
+
61
+ Python 3.11以上が必要です。`validate`、`schema`、Mermaidコード生成はPythonだけで
62
+ 動作します。HTML・XLSX・PDF・SVG・PNGを生成する場合は、Node.js 22.12以上を用意し、
63
+ リポジトリまたは作業環境で`npm ci`を実行してください。
64
+
65
+ ## PyPIへの公開(メンテナ向け)
66
+
67
+ PyPIのTrusted Publisherに、Organization `dse-corp`、Repository `db-teigisho`、
68
+ Workflow `.github/workflows/publish-python.yml`、Environment `pypi`を登録します。
69
+ 登録後はバージョンと同じタグを`origin`へpushすると、品質検査後にPyPIへ公開されます。
70
+
71
+ ```bash
72
+ git tag v0.1.0
73
+ git push origin v0.1.0
74
+ ```
75
+
76
+ ## セットアップ
77
+
78
+ ```bash
79
+ # Node.js 22.12+ が必要
80
+ python3 -m venv .venv
81
+ .venv/bin/pip install -e '.[dev]'
82
+ npm ci
83
+ ```
84
+
85
+ ## 基本操作
86
+
87
+ ```bash
88
+ # YAML定義書を検証
89
+ .venv/bin/dbdef validate definitions/example.yaml
90
+
91
+ # HTML・Excel・PDFとmanifestを一括生成
92
+ .venv/bin/dbdef build definitions/example.yaml --output dist
93
+
94
+ # Mermaid ER図コードを全カラム表示で生成
95
+ .venv/bin/dbdef render definitions/example.yaml --format mermaid --output dist/database-definition.mmd
96
+
97
+ # Mermaid ER図コードをPK/FKだけの表示で生成
98
+ .venv/bin/dbdef render definitions/example.yaml --format mermaid --er-columns keys --output dist/database-definition.mmd
99
+
100
+ # レンダリング済みSVG/PNGを出力
101
+ .venv/bin/dbdef render definitions/example.yaml --format svg --er-columns tables --output dist/database-definition.svg
102
+ .venv/bin/dbdef render definitions/example.yaml --format png --output dist/database-definition.png
103
+
104
+ # JSON Schemaの再生成と、コミット済みSchemaのドリフト検査
105
+ .venv/bin/dbdef schema --output schemas/db-definition.schema.json
106
+ .venv/bin/dbdef schema --check schemas/db-definition.schema.json
107
+ ```
108
+
109
+ YAMLの全項目は [examples/database-definition.yaml](examples/database-definition.yaml)、
110
+ AIエージェントによる作成・編集手順は
111
+ [.agents/skills/manage-db-definitions/SKILL.md](.agents/skills/manage-db-definitions/SKILL.md)
112
+ を参照してください。
113
+
114
+ ### GitHub Copilot向けSkill
115
+
116
+ GitHub Copilotは既存の `.agents/skills/manage-db-definitions` に加え、次の用途別Skillを利用できます。
117
+
118
+ - `.github/skills/review-db-definitions`: YAML定義書とPull Requestのレビュー
119
+ - `.github/skills/publish-db-definitions`: HTML・XLSX・PDF・manifestの生成
120
+ - `.github/skills/evolve-dbdef-tooling`: Schema、検証器、CLI、レンダラーの変更
121
+
122
+ リポジトリ全体のCopilot指示は `.github/copilot-instructions.md` にあります。
123
+
124
+ ## 出力
125
+
126
+ `dbdef build` は次のファイルを出力します。
127
+
128
+ - `<入力名>.html`: ズーム・パン・表示モード切り替え・最大化と詳細パネルを備えたER図、テーブル一覧、各定義を検索・印刷できる自己完結HTML
129
+ - `<入力名>.xlsx`: 文書情報、テーブル一覧、レンダリング済みER図、各テーブル、ビュー、ストアドプロシージャの各シート
130
+ - `<入力名>.pdf`: 表紙、レンダリング済みER図、テーブル一覧、各定義を収録した配布・レビュー用PDF
131
+ - `<入力名>.mmd`: FK制約から推論したMermaid ER Diagramコード
132
+ - `<入力名>.svg` / `<入力名>.png`: 全カラム表示のレンダリング済みER図
133
+ - `manifest.json`: 入力と各成果物のSHA-256、生成日時、ツールバージョン
134
+
135
+ PDFにはNoto Sans JPを埋め込むため、CIや閲覧端末に日本語フォントがない場合も文字を表示できます。
136
+ 同梱フォントのライセンスは `src/db_teigisho/assets/OFL.txt` です。
137
+
138
+ ER図はYAMLに定義されたFKから生成します。`npm ci`で固定されたMermaid CLIとPuppeteerを
139
+ 導入すると、外部CDNなしでSVG/PNGを生成します。HTMLでは埋め込みグラフデータからER図を
140
+ 描画し、「全カラム」「PK・FKのみ」「テーブルのみ」の切り替え、リレーションの「曲線」「直線」
141
+ 「鍵線」の切り替え、ホイールまたはボタンでのズーム、背景ドラッグでのパン、テーブルのドラッグ
142
+ による配置変更、「全体表示」、ER図をページ内で画面いっぱいに展開する「最大化」を利用できます。
143
+ 最大化中は背景スクロールを抑止し、Escapeまたは「元に戻す」で通常表示へ戻せます。鍵線は中央の水平・垂直セグメントをドラッグまたは
144
+ 矢印キーで移動でき、交差箇所を判別するLine jumpをOn/Offできます。線種は再生成せず即時反映され、
145
+ 自己参照、同一テーブル間の複数FK、双方向参照は経路をずらしてFK名を判別できます。
146
+ FKの親子関係を層化した決定的な自動配置は「左→右」と「上→下」を切り替えられ、循環参照や
147
+ 自己参照、孤立テーブル、複数の連結成分も重ならないよう配置してからER図全体を表示します。
148
+ テーブルを選択すると、選択テーブル、直接関連するテーブル、接続線を強調し、関連外の要素を
149
+ 薄く表示します。テーブルまたはカラムの選択時は、インデックス、外部キー、制約、defaultを含む
150
+ 詳細パネルを表示します。矢印キーで選択候補を移動し、EnterまたはSpaceで選択、Escapeまたは
151
+ 閉じるボタンで閉じられます。倍率は5%から300%の範囲です。変更した配置、選択した線種、鍵線位置、
152
+ Line jump設定は同じブラウザの`localStorage`へ保存され、再読み込み時に復元されます。
153
+ 「配置をリセット」で保存済み配置と鍵線位置を破棄して初期状態へ戻せます。
154
+ HTMLはランタイムをすべて同梱するため、`file:` URLかつオフラインで動作します。
155
+ JavaScriptが無効な場合と印刷時には、埋め込み済みの静的SVGを表示します。
156
+ PDFとXLSXには従来どおり全カラム表示を掲載します。参照元FK列がすべてNOT NULLなら親端を必須
157
+ (`||`)、それ以外は任意(`|o`)とし、FKがUNIQUEまたは主キーと一致すれば子端を
158
+ 1(`||`)、それ以外は0以上の多(`o{`)とします。`ON DELETE CASCADE` またはFKが
159
+ 主キーの一部なら実線、それ以外は破線です。`--er-columns` は `all`、`keys`、`tables`
160
+ を指定できます。`render --format svg|png` でも表示モードを指定できます。
161
+
162
+ 自己完結HTMLには、`<script id="dbdef-er-graph" type="application/json">` として
163
+ `format_version: "1.0"` のERグラフデータも埋め込みます。`tables` とその `columns`、
164
+ `relationships` はYAMLの定義順を維持し、各カラムの制約と `key_roles`(`PK`、`UK`、`FK`)、
165
+ 各テーブルの `indexes` と `foreign_keys`、複合FKの `column_pairs`、両端のcardinality、
166
+ `identifying` / `non_identifying` を収録します。
167
+ ブラウザでは要素の `textContent` を `JSON.parse` して取得できます。Pythonから同じ契約を
168
+ 利用する場合は `db_teigisho.er_graph.build_er_graph` を呼び出します。
169
+
170
+ ### HTML ERビューアの拡張API
171
+
172
+ 生成HTMLは `window.dbdefErViewer` にバージョン付きAPIを公開します。`getState()` /
173
+ `setViewState()` は表示モード、ビューポート、全ノード座標を共有し、`setNodePosition()` /
174
+ `setNodePositions()` はドラッグ操作や自動配置から座標を更新します。座標更新後は
175
+ `redrawEdges()` が利用する同じ経路でリレーションを再描画します。
176
+
177
+ 後続機能向けの主な境界は次のとおりです。
178
+
179
+ | 境界 | 用途 |
180
+ | --- | --- |
181
+ | `getGraph()` / `getState()` | 埋め込みグラフと現在のビュー状態をコピーとして取得 |
182
+ | `setMode(mode)` / `setViewport(viewport)` / `fitToView()` | 表示モードとズーム・パン状態を更新 |
183
+ | `getNodePosition(tableId)` / `setNodePosition(tableId, position)` | 単一ノードの座標を取得・更新 |
184
+ | `getNodeSize(tableId, mode)` | 指定表示モード(既定は全カラム)のノード寸法を取得 |
185
+ | `setNodePositions(positions)` | 配置アルゴリズムや保存済み配置から複数座標を一括更新 |
186
+ | `redrawEdges()` | 現在のノード座標とサイズから全エッジを再描画 |
187
+ | `setEdgePathRenderer(renderer)` | エッジ経路戦略を差し替え(`null` で既定へ復帰) |
188
+ | `screenToGraphPoint(clientX, clientY)` | ポインター座標をグラフ座標へ変換 |
189
+
190
+ ビューア要素 `#dbdef-er-viewer` は
191
+ `dbdef:er-view-change`、`dbdef:er-node-position-change`、
192
+ `dbdef:er-edges-redrawn`、`dbdef:er-selection-change` の各`CustomEvent`を発火します。
193
+ ノードDOMには `data-table-id`、カラム行には `data-column-id`、エッジDOMには
194
+ `data-relationship-id`があります。選択対象は `aria-selected` と
195
+ `aria-controls="dbdef-er-details"` で単一の詳細パネルへ関連付けられます。
196
+
197
+ 線種切り替えは`window.dbdefErEdgeRouting` v2.0として分離され、
198
+ `getRoutingMode()` / `setRoutingMode(mode)`で`curve`、`straight`、`orthogonal`を取得・設定できます。
199
+ `getRouteOffsets()` / `setRouteOffset()` / `resetRouteOffsets()`は鍵線の手動位置を管理し、
200
+ `getLineJumpsEnabled()` / `setLineJumpsEnabled()`は交差ジャンプを切り替えます。各戦略は
201
+ `setEdgePathRenderer()`へ登録され、ノード座標計算には関与しません。座標の単一・一括更新および
202
+ ドラッグ時は`redrawEdges()`を通して選択中の経路、FK名、両端のカーディナリティを更新します。
203
+ 保存領域が利用不可または容量超過の場合は図の閲覧と線種切り替えを継続しながら画面上に失敗を表示し、
204
+ `dbdef:er-edge-routing-storage-error`イベントを発火します。鍵線位置は定義IDとグラフ構造ごとに保存し、
205
+ `dbdef:er-route-offset-change`、`dbdef:er-route-offset-reset`、
206
+ `dbdef:er-line-jumps-change`イベントで変更を通知します。
207
+
208
+ 配置操作は`window.dbdefErLayout` v1.0として分離され、`save()`、`restore()`、`reset()`、
209
+ `getStorageKey()`、`getGraphFingerprint()`を公開します。`window.dbdefErAutoLayout` v1.0は
210
+ `run()`、`setDirection()`、`calculate()`を公開し、計算と座標適用を分けて拡張できます。
211
+ 保存キーは文書・データベース識別情報
212
+ のSHA-256と、テーブル・カラム・リレーション構造のフィンガープリントを含みます。構造変更時は
213
+ 同じ定義書の過去配置から物理名が一致するテーブルだけを復元します。新規テーブルは初期位置を
214
+ 基点に、復元済みテーブルと重なる場合だけ空き位置へ移してから全体表示します。保存領域が利用不可
215
+ または容量超過の場合は、図の閲覧とドラッグを継続しながら画面上に保存失敗を表示し、
216
+ `dbdef:er-layout-storage-error`イベントも発火します。
217
+
218
+ 最大化操作は`window.dbdefErMaximize` v1.0として公開され、`isMaximized()`、
219
+ `setMaximized()`、`maximize()`、`restore()`、`toggle()`でページ内表示を切り替えられます。
220
+ ビューア要素は`dbdef:er-maximize-change`イベントを発火し、`detail.maximized`と
221
+ `detail.reason`を提供します。
222
+
223
+ ## 自動検証
224
+
225
+ - `.pre-commit-config.yaml`: `definitions/**/*.yaml` をコミット前に検証
226
+ - `.codex/hooks.json`: Codexが定義YAMLを編集した直後に検証
227
+ - `.github/hooks/database-definitions.json`: GitHub CopilotがYAMLを編集した直後とタスク完了前に検証
228
+ - `.github/workflows/copilot-setup-steps.yml`: Copilot cloud agentへPython依存関係を事前導入
229
+ - `.github/workflows/database-definitions.yml`: テスト、Schemaドリフト、YAML検証、成果物アップロード
230
+
231
+ リポジトリのCodex hookは初回のみ `/hooks` で内容を確認し、信頼してください。
232
+ Copilot hookは編集後に検証結果をコンテキストへ返し、定義が不正な場合は完了前に修正を1回要求します。
233
+ 無限継続を避けるため、再試行後はCIの検証を最終ゲートとします。
@@ -0,0 +1,196 @@
1
+ # db-teigisho
2
+
3
+ Excelで管理していたテーブル定義書を、AIと人間の双方が扱いやすいYAML-firstの成果物へ
4
+ 置き換えるPythonツールです。YAMLをSingle Source of Truth(SSOT)とし、JSON Schema、
5
+ 意味検証、HTML・Excel・PDF、CI向けmanifestを同じ定義から生成します。
6
+
7
+ ## CLIとして利用
8
+
9
+ PyPIからインストールして、`dbdef`コマンドを利用できます。
10
+
11
+ ```bash
12
+ pipx install db-teigisho
13
+ dbdef --version
14
+ dbdef validate path/to/definition.yaml
15
+ ```
16
+
17
+ 更新・削除は次のコマンドで行います。
18
+
19
+ ```bash
20
+ pipx upgrade db-teigisho
21
+ pipx uninstall db-teigisho
22
+ ```
23
+
24
+ Python 3.11以上が必要です。`validate`、`schema`、Mermaidコード生成はPythonだけで
25
+ 動作します。HTML・XLSX・PDF・SVG・PNGを生成する場合は、Node.js 22.12以上を用意し、
26
+ リポジトリまたは作業環境で`npm ci`を実行してください。
27
+
28
+ ## PyPIへの公開(メンテナ向け)
29
+
30
+ PyPIのTrusted Publisherに、Organization `dse-corp`、Repository `db-teigisho`、
31
+ Workflow `.github/workflows/publish-python.yml`、Environment `pypi`を登録します。
32
+ 登録後はバージョンと同じタグを`origin`へpushすると、品質検査後にPyPIへ公開されます。
33
+
34
+ ```bash
35
+ git tag v0.1.0
36
+ git push origin v0.1.0
37
+ ```
38
+
39
+ ## セットアップ
40
+
41
+ ```bash
42
+ # Node.js 22.12+ が必要
43
+ python3 -m venv .venv
44
+ .venv/bin/pip install -e '.[dev]'
45
+ npm ci
46
+ ```
47
+
48
+ ## 基本操作
49
+
50
+ ```bash
51
+ # YAML定義書を検証
52
+ .venv/bin/dbdef validate definitions/example.yaml
53
+
54
+ # HTML・Excel・PDFとmanifestを一括生成
55
+ .venv/bin/dbdef build definitions/example.yaml --output dist
56
+
57
+ # Mermaid ER図コードを全カラム表示で生成
58
+ .venv/bin/dbdef render definitions/example.yaml --format mermaid --output dist/database-definition.mmd
59
+
60
+ # Mermaid ER図コードをPK/FKだけの表示で生成
61
+ .venv/bin/dbdef render definitions/example.yaml --format mermaid --er-columns keys --output dist/database-definition.mmd
62
+
63
+ # レンダリング済みSVG/PNGを出力
64
+ .venv/bin/dbdef render definitions/example.yaml --format svg --er-columns tables --output dist/database-definition.svg
65
+ .venv/bin/dbdef render definitions/example.yaml --format png --output dist/database-definition.png
66
+
67
+ # JSON Schemaの再生成と、コミット済みSchemaのドリフト検査
68
+ .venv/bin/dbdef schema --output schemas/db-definition.schema.json
69
+ .venv/bin/dbdef schema --check schemas/db-definition.schema.json
70
+ ```
71
+
72
+ YAMLの全項目は [examples/database-definition.yaml](examples/database-definition.yaml)、
73
+ AIエージェントによる作成・編集手順は
74
+ [.agents/skills/manage-db-definitions/SKILL.md](.agents/skills/manage-db-definitions/SKILL.md)
75
+ を参照してください。
76
+
77
+ ### GitHub Copilot向けSkill
78
+
79
+ GitHub Copilotは既存の `.agents/skills/manage-db-definitions` に加え、次の用途別Skillを利用できます。
80
+
81
+ - `.github/skills/review-db-definitions`: YAML定義書とPull Requestのレビュー
82
+ - `.github/skills/publish-db-definitions`: HTML・XLSX・PDF・manifestの生成
83
+ - `.github/skills/evolve-dbdef-tooling`: Schema、検証器、CLI、レンダラーの変更
84
+
85
+ リポジトリ全体のCopilot指示は `.github/copilot-instructions.md` にあります。
86
+
87
+ ## 出力
88
+
89
+ `dbdef build` は次のファイルを出力します。
90
+
91
+ - `<入力名>.html`: ズーム・パン・表示モード切り替え・最大化と詳細パネルを備えたER図、テーブル一覧、各定義を検索・印刷できる自己完結HTML
92
+ - `<入力名>.xlsx`: 文書情報、テーブル一覧、レンダリング済みER図、各テーブル、ビュー、ストアドプロシージャの各シート
93
+ - `<入力名>.pdf`: 表紙、レンダリング済みER図、テーブル一覧、各定義を収録した配布・レビュー用PDF
94
+ - `<入力名>.mmd`: FK制約から推論したMermaid ER Diagramコード
95
+ - `<入力名>.svg` / `<入力名>.png`: 全カラム表示のレンダリング済みER図
96
+ - `manifest.json`: 入力と各成果物のSHA-256、生成日時、ツールバージョン
97
+
98
+ PDFにはNoto Sans JPを埋め込むため、CIや閲覧端末に日本語フォントがない場合も文字を表示できます。
99
+ 同梱フォントのライセンスは `src/db_teigisho/assets/OFL.txt` です。
100
+
101
+ ER図はYAMLに定義されたFKから生成します。`npm ci`で固定されたMermaid CLIとPuppeteerを
102
+ 導入すると、外部CDNなしでSVG/PNGを生成します。HTMLでは埋め込みグラフデータからER図を
103
+ 描画し、「全カラム」「PK・FKのみ」「テーブルのみ」の切り替え、リレーションの「曲線」「直線」
104
+ 「鍵線」の切り替え、ホイールまたはボタンでのズーム、背景ドラッグでのパン、テーブルのドラッグ
105
+ による配置変更、「全体表示」、ER図をページ内で画面いっぱいに展開する「最大化」を利用できます。
106
+ 最大化中は背景スクロールを抑止し、Escapeまたは「元に戻す」で通常表示へ戻せます。鍵線は中央の水平・垂直セグメントをドラッグまたは
107
+ 矢印キーで移動でき、交差箇所を判別するLine jumpをOn/Offできます。線種は再生成せず即時反映され、
108
+ 自己参照、同一テーブル間の複数FK、双方向参照は経路をずらしてFK名を判別できます。
109
+ FKの親子関係を層化した決定的な自動配置は「左→右」と「上→下」を切り替えられ、循環参照や
110
+ 自己参照、孤立テーブル、複数の連結成分も重ならないよう配置してからER図全体を表示します。
111
+ テーブルを選択すると、選択テーブル、直接関連するテーブル、接続線を強調し、関連外の要素を
112
+ 薄く表示します。テーブルまたはカラムの選択時は、インデックス、外部キー、制約、defaultを含む
113
+ 詳細パネルを表示します。矢印キーで選択候補を移動し、EnterまたはSpaceで選択、Escapeまたは
114
+ 閉じるボタンで閉じられます。倍率は5%から300%の範囲です。変更した配置、選択した線種、鍵線位置、
115
+ Line jump設定は同じブラウザの`localStorage`へ保存され、再読み込み時に復元されます。
116
+ 「配置をリセット」で保存済み配置と鍵線位置を破棄して初期状態へ戻せます。
117
+ HTMLはランタイムをすべて同梱するため、`file:` URLかつオフラインで動作します。
118
+ JavaScriptが無効な場合と印刷時には、埋め込み済みの静的SVGを表示します。
119
+ PDFとXLSXには従来どおり全カラム表示を掲載します。参照元FK列がすべてNOT NULLなら親端を必須
120
+ (`||`)、それ以外は任意(`|o`)とし、FKがUNIQUEまたは主キーと一致すれば子端を
121
+ 1(`||`)、それ以外は0以上の多(`o{`)とします。`ON DELETE CASCADE` またはFKが
122
+ 主キーの一部なら実線、それ以外は破線です。`--er-columns` は `all`、`keys`、`tables`
123
+ を指定できます。`render --format svg|png` でも表示モードを指定できます。
124
+
125
+ 自己完結HTMLには、`<script id="dbdef-er-graph" type="application/json">` として
126
+ `format_version: "1.0"` のERグラフデータも埋め込みます。`tables` とその `columns`、
127
+ `relationships` はYAMLの定義順を維持し、各カラムの制約と `key_roles`(`PK`、`UK`、`FK`)、
128
+ 各テーブルの `indexes` と `foreign_keys`、複合FKの `column_pairs`、両端のcardinality、
129
+ `identifying` / `non_identifying` を収録します。
130
+ ブラウザでは要素の `textContent` を `JSON.parse` して取得できます。Pythonから同じ契約を
131
+ 利用する場合は `db_teigisho.er_graph.build_er_graph` を呼び出します。
132
+
133
+ ### HTML ERビューアの拡張API
134
+
135
+ 生成HTMLは `window.dbdefErViewer` にバージョン付きAPIを公開します。`getState()` /
136
+ `setViewState()` は表示モード、ビューポート、全ノード座標を共有し、`setNodePosition()` /
137
+ `setNodePositions()` はドラッグ操作や自動配置から座標を更新します。座標更新後は
138
+ `redrawEdges()` が利用する同じ経路でリレーションを再描画します。
139
+
140
+ 後続機能向けの主な境界は次のとおりです。
141
+
142
+ | 境界 | 用途 |
143
+ | --- | --- |
144
+ | `getGraph()` / `getState()` | 埋め込みグラフと現在のビュー状態をコピーとして取得 |
145
+ | `setMode(mode)` / `setViewport(viewport)` / `fitToView()` | 表示モードとズーム・パン状態を更新 |
146
+ | `getNodePosition(tableId)` / `setNodePosition(tableId, position)` | 単一ノードの座標を取得・更新 |
147
+ | `getNodeSize(tableId, mode)` | 指定表示モード(既定は全カラム)のノード寸法を取得 |
148
+ | `setNodePositions(positions)` | 配置アルゴリズムや保存済み配置から複数座標を一括更新 |
149
+ | `redrawEdges()` | 現在のノード座標とサイズから全エッジを再描画 |
150
+ | `setEdgePathRenderer(renderer)` | エッジ経路戦略を差し替え(`null` で既定へ復帰) |
151
+ | `screenToGraphPoint(clientX, clientY)` | ポインター座標をグラフ座標へ変換 |
152
+
153
+ ビューア要素 `#dbdef-er-viewer` は
154
+ `dbdef:er-view-change`、`dbdef:er-node-position-change`、
155
+ `dbdef:er-edges-redrawn`、`dbdef:er-selection-change` の各`CustomEvent`を発火します。
156
+ ノードDOMには `data-table-id`、カラム行には `data-column-id`、エッジDOMには
157
+ `data-relationship-id`があります。選択対象は `aria-selected` と
158
+ `aria-controls="dbdef-er-details"` で単一の詳細パネルへ関連付けられます。
159
+
160
+ 線種切り替えは`window.dbdefErEdgeRouting` v2.0として分離され、
161
+ `getRoutingMode()` / `setRoutingMode(mode)`で`curve`、`straight`、`orthogonal`を取得・設定できます。
162
+ `getRouteOffsets()` / `setRouteOffset()` / `resetRouteOffsets()`は鍵線の手動位置を管理し、
163
+ `getLineJumpsEnabled()` / `setLineJumpsEnabled()`は交差ジャンプを切り替えます。各戦略は
164
+ `setEdgePathRenderer()`へ登録され、ノード座標計算には関与しません。座標の単一・一括更新および
165
+ ドラッグ時は`redrawEdges()`を通して選択中の経路、FK名、両端のカーディナリティを更新します。
166
+ 保存領域が利用不可または容量超過の場合は図の閲覧と線種切り替えを継続しながら画面上に失敗を表示し、
167
+ `dbdef:er-edge-routing-storage-error`イベントを発火します。鍵線位置は定義IDとグラフ構造ごとに保存し、
168
+ `dbdef:er-route-offset-change`、`dbdef:er-route-offset-reset`、
169
+ `dbdef:er-line-jumps-change`イベントで変更を通知します。
170
+
171
+ 配置操作は`window.dbdefErLayout` v1.0として分離され、`save()`、`restore()`、`reset()`、
172
+ `getStorageKey()`、`getGraphFingerprint()`を公開します。`window.dbdefErAutoLayout` v1.0は
173
+ `run()`、`setDirection()`、`calculate()`を公開し、計算と座標適用を分けて拡張できます。
174
+ 保存キーは文書・データベース識別情報
175
+ のSHA-256と、テーブル・カラム・リレーション構造のフィンガープリントを含みます。構造変更時は
176
+ 同じ定義書の過去配置から物理名が一致するテーブルだけを復元します。新規テーブルは初期位置を
177
+ 基点に、復元済みテーブルと重なる場合だけ空き位置へ移してから全体表示します。保存領域が利用不可
178
+ または容量超過の場合は、図の閲覧とドラッグを継続しながら画面上に保存失敗を表示し、
179
+ `dbdef:er-layout-storage-error`イベントも発火します。
180
+
181
+ 最大化操作は`window.dbdefErMaximize` v1.0として公開され、`isMaximized()`、
182
+ `setMaximized()`、`maximize()`、`restore()`、`toggle()`でページ内表示を切り替えられます。
183
+ ビューア要素は`dbdef:er-maximize-change`イベントを発火し、`detail.maximized`と
184
+ `detail.reason`を提供します。
185
+
186
+ ## 自動検証
187
+
188
+ - `.pre-commit-config.yaml`: `definitions/**/*.yaml` をコミット前に検証
189
+ - `.codex/hooks.json`: Codexが定義YAMLを編集した直後に検証
190
+ - `.github/hooks/database-definitions.json`: GitHub CopilotがYAMLを編集した直後とタスク完了前に検証
191
+ - `.github/workflows/copilot-setup-steps.yml`: Copilot cloud agentへPython依存関係を事前導入
192
+ - `.github/workflows/database-definitions.yml`: テスト、Schemaドリフト、YAML検証、成果物アップロード
193
+
194
+ リポジトリのCodex hookは初回のみ `/hooks` で内容を確認し、信頼してください。
195
+ Copilot hookは編集後に検証結果をコンテキストへ返し、定義が不正な場合は完了前に修正を1回要求します。
196
+ 無限継続を避けるため、再試行後はCIの検証を最終ゲートとします。
@@ -0,0 +1,117 @@
1
+ # yaml-language-server: $schema=../schemas/db-definition.schema.json
2
+ format_version: "1.0"
3
+
4
+ document:
5
+ project_number: PJ-001
6
+ system_name: 受注管理システム
7
+ subsystem_name: 受注API
8
+ created_at: "2026-08-01T09:00:00+09:00"
9
+ updated_at: "2026-08-09T18:30:00+09:00"
10
+
11
+ database:
12
+ dbms_name: PostgreSQL
13
+ dbms_version: "17.5"
14
+ server_name: db.example.internal
15
+ port: 5432
16
+ database_name: orders
17
+ schema_name: public
18
+ collation: ja_JP.UTF-8
19
+
20
+ tables:
21
+ - physical_name: customers
22
+ logical_name: 顧客
23
+ description: 顧客の基本情報を管理する。
24
+ columns:
25
+ - physical_name: customer_id
26
+ logical_name: 顧客ID
27
+ data_type: uuid
28
+ default: gen_random_uuid()
29
+ not_null: true
30
+ unique: true
31
+ primary_key: true
32
+ description: 顧客を一意に識別するID。
33
+ - physical_name: email
34
+ logical_name: メールアドレス
35
+ data_type: varchar
36
+ length: 320
37
+ not_null: true
38
+ unique: true
39
+ primary_key: false
40
+ indexes:
41
+ - name: idx_customers_email
42
+ type: btree
43
+ unique: true
44
+ columns:
45
+ - name: email
46
+ order: ASC
47
+ include_columns: []
48
+ foreign_keys: []
49
+
50
+ - physical_name: orders
51
+ logical_name: 受注
52
+ description: 顧客から受け付けた受注を管理する。
53
+ columns:
54
+ - physical_name: order_id
55
+ logical_name: 受注ID
56
+ data_type: bigint
57
+ not_null: true
58
+ unique: false
59
+ primary_key: true
60
+ - physical_name: customer_id
61
+ logical_name: 顧客ID
62
+ data_type: uuid
63
+ not_null: true
64
+ unique: false
65
+ primary_key: false
66
+ - physical_name: amount
67
+ logical_name: 合計金額
68
+ data_type: numeric
69
+ length: 18
70
+ scale: 2
71
+ default: 0
72
+ not_null: true
73
+ unique: false
74
+ primary_key: false
75
+ indexes:
76
+ - name: idx_orders_customer
77
+ type: btree
78
+ unique: false
79
+ columns:
80
+ - name: customer_id
81
+ order: ASC
82
+ include_columns:
83
+ - amount
84
+ where: amount > 0
85
+ foreign_keys:
86
+ - name: fk_orders_customers
87
+ columns:
88
+ - customer_id
89
+ referenced_table: customers
90
+ referenced_columns:
91
+ - customer_id
92
+ on_update: NO ACTION
93
+ on_delete: RESTRICT
94
+ deferrable: false
95
+
96
+ views:
97
+ - physical_name: customer_order_totals
98
+ logical_name: 顧客別受注金額
99
+ description: 顧客単位の受注金額を集計する。
100
+ sql: |
101
+ SELECT
102
+ customer_id,
103
+ SUM(amount) AS total
104
+ FROM orders
105
+ GROUP BY customer_id;
106
+
107
+ stored_procedures:
108
+ - physical_name: close_orders
109
+ logical_name: 受注締め処理
110
+ description: 対象日までの受注を締める。
111
+ sql: |
112
+ CREATE PROCEDURE close_orders(IN closing_date date)
113
+ LANGUAGE SQL
114
+ AS $$
115
+ SELECT closing_date;
116
+ $$;
117
+
@@ -0,0 +1,74 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.27"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "db-teigisho"
7
+ version = "0.1.0"
8
+ description = "YAML-first database definition validation and publishing"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = { text = "MIT" }
12
+ authors = [{ name = "dse-corp" }]
13
+ keywords = ["database", "database-definition", "yaml", "schema", "cli"]
14
+ classifiers = [
15
+ "Development Status :: 3 - Alpha",
16
+ "Environment :: Console",
17
+ "Intended Audience :: Developers",
18
+ "License :: OSI Approved :: MIT License",
19
+ "Programming Language :: Python :: 3",
20
+ "Programming Language :: Python :: 3.11",
21
+ "Programming Language :: Python :: 3.12",
22
+ "Programming Language :: Python :: 3.13",
23
+ "Topic :: Database",
24
+ ]
25
+ dependencies = [
26
+ "Jinja2>=3.1,<4",
27
+ "openpyxl>=3.1,<4",
28
+ "Pillow>=11.2,<12",
29
+ "pydantic>=2.11,<3",
30
+ "PyYAML>=6.0,<7",
31
+ "reportlab>=4.4,<5",
32
+ ]
33
+
34
+ [project.urls]
35
+ Homepage = "https://github.com/dse-corp/db-teigisho"
36
+ Repository = "https://github.com/dse-corp/db-teigisho"
37
+ Issues = "https://github.com/dse-corp/db-teigisho/issues"
38
+
39
+ [project.optional-dependencies]
40
+ dev = [
41
+ "build>=1.2,<2",
42
+ "mypy>=1.15,<2",
43
+ "pytest>=8.3,<9",
44
+ "pytest-cov>=6.1,<7",
45
+ "ruff>=0.11,<1",
46
+ "types-openpyxl>=3.1,<4",
47
+ "types-PyYAML>=6.0,<7",
48
+ "types-reportlab>=4.4,<5",
49
+ ]
50
+
51
+ [project.scripts]
52
+ dbdef = "db_teigisho.cli:main"
53
+
54
+ [tool.hatch.build.targets.wheel]
55
+ packages = ["src/db_teigisho"]
56
+
57
+ [tool.hatch.build.targets.sdist]
58
+ include = ["src/db_teigisho", "README.md", "schemas", "examples"]
59
+
60
+ [tool.pytest.ini_options]
61
+ testpaths = ["tests"]
62
+ addopts = "--cov=db_teigisho --cov-report=term-missing --cov-fail-under=80"
63
+
64
+ [tool.ruff]
65
+ line-length = 100
66
+ target-version = "py311"
67
+
68
+ [tool.ruff.lint]
69
+ select = ["E", "F", "I", "N", "UP", "B", "SIM"]
70
+
71
+ [tool.mypy]
72
+ python_version = "3.11"
73
+ strict = true
74
+ packages = ["db_teigisho"]