building-standards-act-mcp 1.6.0 → 1.8.1
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/README.md +80 -53
- package/dist/lib/article-analyzer.js +3 -4
- package/dist/lib/article-analyzer.js.map +1 -1
- package/dist/lib/article-fetcher.d.ts +12 -0
- package/dist/lib/article-fetcher.js +65 -0
- package/dist/lib/article-fetcher.js.map +1 -0
- package/dist/lib/article-schemas.d.ts +165 -0
- package/dist/lib/article-schemas.js +47 -0
- package/dist/lib/article-schemas.js.map +1 -0
- package/dist/lib/citation-verifier.js +5 -6
- package/dist/lib/citation-verifier.js.map +1 -1
- package/dist/lib/egov-client.d.ts +13 -1
- package/dist/lib/egov-client.js +58 -1
- package/dist/lib/egov-client.js.map +1 -1
- package/dist/lib/egov-parser.d.ts +38 -0
- package/dist/lib/egov-parser.js +14 -3
- package/dist/lib/egov-parser.js.map +1 -1
- package/dist/lib/errors.d.ts +3 -2
- package/dist/lib/errors.js +5 -3
- package/dist/lib/errors.js.map +1 -1
- package/dist/lib/kokuji-registry.d.ts +2 -3
- package/dist/lib/kokuji-registry.js +9 -77
- package/dist/lib/kokuji-registry.js.map +1 -1
- package/dist/lib/mlit-client.d.ts +5 -2
- package/dist/lib/mlit-client.js +52 -6
- package/dist/lib/mlit-client.js.map +1 -1
- package/dist/lib/openapi-spec.js +2 -1
- package/dist/lib/openapi-spec.js.map +1 -1
- package/dist/lib/related-law-finder.js +3 -4
- package/dist/lib/related-law-finder.js.map +1 -1
- package/dist/lib/resilience.js +3 -1
- package/dist/lib/resilience.js.map +1 -1
- package/dist/lib/revision-tracker.d.ts +5 -5
- package/dist/lib/revision-tracker.js +16 -8
- package/dist/lib/revision-tracker.js.map +1 -1
- package/dist/lib/tool-helpers.d.ts +15 -0
- package/dist/lib/tool-helpers.js +37 -0
- package/dist/lib/tool-helpers.js.map +1 -1
- package/dist/lib/tool-invoker.d.ts +4 -0
- package/dist/lib/tool-invoker.js +2 -1
- package/dist/lib/tool-invoker.js.map +1 -1
- package/dist/lib/types.d.ts +17 -0
- package/dist/lib/version.d.ts +2 -0
- package/dist/lib/version.js +3 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/server.js +10 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/analyze-article.js +37 -2
- package/dist/tools/analyze-article.js.map +1 -1
- package/dist/tools/check-law-updates.js +31 -9
- package/dist/tools/check-law-updates.js.map +1 -1
- package/dist/tools/get-full-law.js +23 -3
- package/dist/tools/get-full-law.js.map +1 -1
- package/dist/tools/get-kokuji.js +54 -17
- package/dist/tools/get-kokuji.js.map +1 -1
- package/dist/tools/get-law.js +52 -8
- package/dist/tools/get-law.js.map +1 -1
- package/dist/tools/get-laws-batch.js +44 -41
- package/dist/tools/get-laws-batch.js.map +1 -1
- package/dist/tools/get-metrics.js +28 -2
- package/dist/tools/get-metrics.js.map +1 -1
- package/dist/tools/search-articles.d.ts +2 -0
- package/dist/tools/search-articles.js +86 -0
- package/dist/tools/search-articles.js.map +1 -0
- package/dist/tools/search-law.js +7 -2
- package/dist/tools/search-law.js.map +1 -1
- package/dist/tools/suggest-related.js +7 -2
- package/dist/tools/suggest-related.js.map +1 -1
- package/dist/tools/verify-citation.js +41 -3
- package/dist/tools/verify-citation.js.map +1 -1
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -11,12 +11,13 @@ AI の建築法規回答に含まれるハルシネーションを、条文原
|
|
|
11
11
|
|
|
12
12
|
## 特徴
|
|
13
13
|
|
|
14
|
-
- **法令取得** — e-Gov 法令 API v2
|
|
15
|
-
- **法令検索** —
|
|
14
|
+
- **法令取得** — e-Gov 法令 API v2 から条文を条単位(`elm` 指定)で取得。1 条あたり数 KB で済み、全文 1 MB 超を読まない
|
|
15
|
+
- **法令検索** — 法令名で建築関連法令を横断検索
|
|
16
|
+
- **条文本文検索** — e-Gov のキーワード検索 API で条文本文を全文検索(`search_articles`)
|
|
16
17
|
- **法令全文取得** — 法令全体のテキストを取得
|
|
17
18
|
- **告示取得** — 建築基準法が技術基準を委任している告示を国土交通省の告示データベース(PDF)から取得
|
|
18
19
|
- **検索ファースト** — e-Gov API 検索による動的な法令解決。プリセットに限らず、e-Gov 収録の全法令を取得可能
|
|
19
|
-
- **略称マップ** — 建築基準法・消防法・都市計画法ほか
|
|
20
|
+
- **略称マップ** — 建築基準法・消防法・都市計画法ほか 116 法令の略称を登録済み。「建基法」「都計法」「消防法」等の略称で指定可能
|
|
20
21
|
- **キャッシュ** — 検索 30 分・法令データ 24 時間の TTL キャッシュ(永続化オプションあり)
|
|
21
22
|
- **API 耐障害性** — 自動リトライ(exponential backoff)+ サーキットブレーカー
|
|
22
23
|
- **運用可視化** — 構造化 JSON ログ + 使用量メトリクス(`get_metrics` ツール)
|
|
@@ -25,27 +26,29 @@ AI の建築法規回答に含まれるハルシネーションを、条文原
|
|
|
25
26
|
|
|
26
27
|
Vercel にデプロイすると、Claude.ai からすぐに使えます。環境変数の設定は不要です(e-Gov API は公開 API)。
|
|
27
28
|
|
|
29
|
+
公開インスタンス: `https://building-standards-act-mcp.vercel.app/api/mcp`(自分でデプロイしなくても、この URL をそのまま Custom Connector に登録できます)
|
|
30
|
+
|
|
28
31
|
[](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FSora-bluesky%2Fbuilding-standards-act-mcp)
|
|
29
32
|
|
|
30
33
|
### Claude.ai でのセットアップ(Free/Pro/Max/Team/Enterprise)
|
|
31
34
|
|
|
32
|
-
>
|
|
35
|
+
> Custom Connectors は Free / Pro / Max / Team / Enterprise の各プランで利用できます(Free プランは 1 件まで)。ローカルで動かしたい場合は [npx(ローカル)でのセットアップ](#npx推奨) を参照してください。
|
|
33
36
|
|
|
34
|
-
1.
|
|
35
|
-
2. [claude.ai](https://claude.ai) →
|
|
36
|
-
3.
|
|
37
|
-
4. URL に `https://
|
|
37
|
+
1. 公開インスタンスを使う場合はこの手順を飛ばす。自分でホストする場合は上の「Deploy with Vercel」ボタンでデプロイ(ワンクリック)
|
|
38
|
+
2. [claude.ai](https://claude.ai) → Customize → Connectors
|
|
39
|
+
3. 「+ Add」→「Add custom connector」をクリック
|
|
40
|
+
4. URL に `https://building-standards-act-mcp.vercel.app/api/mcp`(自分でデプロイした場合はその URL)を入力し、認証は「No sign in」を選択
|
|
38
41
|
5. チャットで「+」→「Connectors」→ building-standards-act を有効化
|
|
39
42
|
6. 「建築基準法第20条を教えて」と質問
|
|
40
43
|
|
|
41
44
|
> 参考: [Get started with custom connectors using remote MCP](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp)
|
|
42
45
|
|
|
43
|
-
### Vercel
|
|
46
|
+
### Vercel での実行時間
|
|
44
47
|
|
|
45
|
-
-
|
|
46
|
-
- `get_kokuji`(告示取得)は PDF ダウンロード +
|
|
47
|
-
- `check_law_updates` の大規模グループ(9章: 53
|
|
48
|
-
- `BUILDING_LAW_REQUEST_TIMEOUT=8000`
|
|
48
|
+
- Vercel Functions の実行時間は Hobby プランでも既定 300 秒です(Fluid compute)。本リポの `vercel.json` は `maxDuration` を 60 秒に設定しています
|
|
49
|
+
- `get_kokuji`(告示取得)は PDF ダウンロード + パースが重いため、60 秒を超える場合は `vercel.json` の `maxDuration` を引き上げてください
|
|
50
|
+
- `check_law_updates` の大規模グループ(9章: 53法令)は最大 5 並行で実行します(`BUILDING_LAW_CONCURRENCY` で調整可能)
|
|
51
|
+
- `BUILDING_LAW_REQUEST_TIMEOUT=8000` を設定して e-Gov API 呼び出しのタイムアウトを短縮できます
|
|
49
52
|
|
|
50
53
|
---
|
|
51
54
|
|
|
@@ -137,18 +140,19 @@ npm run build
|
|
|
137
140
|
|
|
138
141
|
## MCP ツール
|
|
139
142
|
|
|
140
|
-
| ツール | 説明
|
|
141
|
-
| ------------------- |
|
|
142
|
-
| `get_law` | 条番号を指定して法令の条文を取得する。略称・正式名称のいずれでも指定可能
|
|
143
|
-
| `get_full_law` |
|
|
144
|
-
| `search_law` |
|
|
145
|
-
| `
|
|
146
|
-
| `
|
|
147
|
-
| `
|
|
148
|
-
| `
|
|
149
|
-
| `
|
|
150
|
-
| `
|
|
151
|
-
| `
|
|
143
|
+
| ツール | 説明 |
|
|
144
|
+
| ------------------- | --------------------------------------------------------------------------------------------------------------- |
|
|
145
|
+
| `get_law` | 条番号を指定して法令の条文を取得する。略称・正式名称のいずれでも指定可能 |
|
|
146
|
+
| `get_full_law` | 法令の全文を取得する。`max_chars`(既定 100,000)で区切り、続きは `offset` で取る |
|
|
147
|
+
| `search_law` | 法令名(タイトル)で建築関連法令を検索する。略称マップと e-Gov API の両方を検索。条文本文の検索は `search_articles` |
|
|
148
|
+
| `search_articles` | 条文本文をキーワードで全文検索する(e-Gov `/keyword`)。法令名で絞り込み可。条番号は返らないので `get_law` で確定する |
|
|
149
|
+
| `get_kokuji` | 建築基準法が技術基準を委任している告示の全文を取得する(省エネ告示は国交省 PDF から直接取得) |
|
|
150
|
+
| `check_law_updates` | 法令の改正状況を e-Gov API で確認する。`since`(既定は 12 か月前)より後の改正だけを「改正あり」にする |
|
|
151
|
+
| `get_laws_batch` | 複数の法令・条文を一括取得する(最大20件、1 条ごとに条単位で取得) |
|
|
152
|
+
| `verify_citation` | AIの回答に含まれる法令引用を検証する(条文存在確認・テキスト照合、最大10件) |
|
|
153
|
+
| `suggest_related` | 指定した条文の関連法令・委任先・同法令内参照を自動抽出して提案する |
|
|
154
|
+
| `analyze_article` | 条文の構造解析メタデータ(項数・号数・参照統計・プレビュー)をJSON形式で返す |
|
|
155
|
+
| `get_metrics` | サーバーの使用量メトリクスを返す(ツール呼び出し回数・APIリクエスト数・キャッシュヒット率) |
|
|
152
156
|
|
|
153
157
|
### パラメータ
|
|
154
158
|
|
|
@@ -162,21 +166,34 @@ npm run build
|
|
|
162
166
|
|
|
163
167
|
#### `get_full_law`
|
|
164
168
|
|
|
165
|
-
| パラメータ
|
|
166
|
-
|
|
|
167
|
-
| `law_name`
|
|
169
|
+
| パラメータ | 説明 | 例 |
|
|
170
|
+
| ----------- | --------------------------------------------- | ---------------------------- |
|
|
171
|
+
| `law_name` | 法令名(正式名称または略称) | `建築基準法施行令`, `建基令` |
|
|
172
|
+
| `max_chars` | 1 回に返す最大文字数(既定 100,000) | `50000` |
|
|
173
|
+
| `offset` | 続きを取るときの開始位置(末尾の案内に出る値) | `100000` |
|
|
168
174
|
|
|
169
175
|
#### `search_law`
|
|
170
176
|
|
|
171
|
-
| パラメータ | 説明
|
|
172
|
-
| ---------- |
|
|
173
|
-
| `keyword` |
|
|
177
|
+
| パラメータ | 説明 | 例 |
|
|
178
|
+
| ---------- | ---------------------- | ---------------------- |
|
|
179
|
+
| `keyword` | 法令名に含まれる語 | `建築`, `都市計画` |
|
|
180
|
+
|
|
181
|
+
#### `search_articles`
|
|
182
|
+
|
|
183
|
+
| パラメータ | 説明 | 例 |
|
|
184
|
+
| ----------- | ------------------------------------------------------------ | ---------------------- |
|
|
185
|
+
| `keyword` | 条文本文に含まれる語。AND / OR / NOT と `*` `?` が使える | `耐火構造`, `壁量` |
|
|
186
|
+
| `law_title` | 法令名または略称で絞り込み(省略時は e-Gov の全法令) | `建築基準法` |
|
|
187
|
+
| `limit` | 返す該当文の数(既定 10、最大 50) | `20` |
|
|
188
|
+
| `offset` | 続きを取るときの開始位置(応答の `next_offset` を渡す) | `10` |
|
|
174
189
|
|
|
175
190
|
#### `get_kokuji`
|
|
176
191
|
|
|
177
|
-
| パラメータ | 説明
|
|
178
|
-
| ------------- |
|
|
179
|
-
| `kokuji_name` | 告示名
|
|
192
|
+
| パラメータ | 説明 | 例 |
|
|
193
|
+
| ------------- | ------------------------------------- | ------------------------------ |
|
|
194
|
+
| `kokuji_name` | 告示名 | `耐火構造の構造方法を定める件` |
|
|
195
|
+
| `max_chars` | 1 回に返す最大文字数(既定 100,000) | `50000` |
|
|
196
|
+
| `offset` | 続きを取るときの開始位置 | `100000` |
|
|
180
197
|
|
|
181
198
|
#### `check_law_updates`
|
|
182
199
|
|
|
@@ -185,6 +202,7 @@ npm run build
|
|
|
185
202
|
| `law_name` | 法令名または略称(単体チェック) | `建築基準法` |
|
|
186
203
|
| `group` | 章グループ(バッチチェック、省略時は全章) | `1章` |
|
|
187
204
|
| `show_history` | 改正履歴の詳細を表示(`law_name` 指定時) | `true` |
|
|
205
|
+
| `since` | 基準日。これより後の改正だけを報告(省略時は 12 か月前) | `2026-01-01` |
|
|
188
206
|
|
|
189
207
|
#### `get_laws_batch`
|
|
190
208
|
|
|
@@ -235,8 +253,16 @@ npm run build
|
|
|
235
253
|
### 法令検索
|
|
236
254
|
|
|
237
255
|
```
|
|
238
|
-
|
|
239
|
-
→ search_law(keyword="
|
|
256
|
+
都市計画に関する法令を検索して
|
|
257
|
+
→ search_law(keyword="都市計画")
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 条文本文検索
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
建築基準法で「耐火構造」が出てくる条文を探して
|
|
264
|
+
→ search_articles(keyword="耐火構造", law_title="建築基準法")
|
|
265
|
+
→ 該当文と区分(本則 / 附則)が返るので、条番号は get_law で確定する
|
|
240
266
|
```
|
|
241
267
|
|
|
242
268
|
### 全文取得
|
|
@@ -261,6 +287,9 @@ npm run build
|
|
|
261
287
|
|
|
262
288
|
建築基準法施行令の附則第1条を取得して
|
|
263
289
|
→ get_law(law_name="建築基準法施行令", article_number="附則第1条")
|
|
290
|
+
|
|
291
|
+
未施行の改正附則(現行データに無いときは改正履歴から未施行版を取る)
|
|
292
|
+
→ get_law(law_name="建築基準法施行令", article_number="附則(令和8年政令第284号)")
|
|
264
293
|
```
|
|
265
294
|
|
|
266
295
|
### 別表取得
|
|
@@ -315,9 +344,9 @@ AI が建築法規について回答する際、条文の引用ミスや存在
|
|
|
315
344
|
→ 「第20条第1項第三号の記載に誤りがあります。正しくは…」
|
|
316
345
|
```
|
|
317
346
|
|
|
318
|
-
## 対応法令一覧(
|
|
347
|
+
## 対応法令一覧(116 法令 + e-Gov 全法令)
|
|
319
348
|
|
|
320
|
-
> 以下の
|
|
349
|
+
> 以下の 116 法令は略称マップに登録済みです。略称マップに含まれない法令も、正式名称を指定すれば e-Gov API 検索で動的に取得できます。
|
|
321
350
|
|
|
322
351
|
### 総則(4 法令)
|
|
323
352
|
|
|
@@ -495,21 +524,19 @@ AI が建築法規について回答する際、条文の引用ミスや存在
|
|
|
495
524
|
| 被災市街地復興特別措置法 | 被災市街地復興法 |
|
|
496
525
|
| 被災区分所有建物の再建等に関する特別措置法 | 被災マンション法 |
|
|
497
526
|
|
|
498
|
-
##
|
|
499
|
-
|
|
500
|
-
e-Gov API は告示を収録していないため、`get_kokuji` は国土交通省の告示・通達データベース(Excel → PDF
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
| 建築物エネルギー消費性能基準等を定める省令における算出方法等に係る事項 | 省エネ(UA値) |
|
|
512
|
-
| 住宅部分の外壁、窓等を通しての熱の損失の防止に関する基準及び一次エネルギー消費量に関する基準 | 省エネ(断熱等性能等級) |
|
|
527
|
+
## 告示の取得
|
|
528
|
+
|
|
529
|
+
e-Gov API は告示を収録していないため、`get_kokuji` は国土交通省の告示・通達データベース(Excel → PDF)から正式名称で動的に取得します。見つからない場合は e-Gov API のキーワード検索にフォールバックします。
|
|
530
|
+
|
|
531
|
+
ハードコードされたプリセットは持たず、常に最新の告示データベースから取得するため、改正後も陳腐化しません。
|
|
532
|
+
|
|
533
|
+
```
|
|
534
|
+
耐火構造の構造方法を定める件を取得して
|
|
535
|
+
→ get_kokuji(kokuji_name="耐火構造の構造方法を定める件")
|
|
536
|
+
|
|
537
|
+
木造建築物の軸組の設置の基準を定める件を取得して
|
|
538
|
+
→ get_kokuji(kokuji_name="木造建築物の軸組の設置の基準を定める件")
|
|
539
|
+
```
|
|
513
540
|
|
|
514
541
|
## 法令解決の仕組み
|
|
515
542
|
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { parseArticleStructured } from "./egov-parser.js";
|
|
1
|
+
import { fetchParsedArticle } from "./article-fetcher.js";
|
|
3
2
|
import { formatArticleRef } from "./errors.js";
|
|
4
3
|
import { resolveLawId } from "./law-resolver.js";
|
|
5
4
|
const PREVIEW_LENGTH = 100;
|
|
@@ -60,8 +59,8 @@ export async function analyzeArticle(lawName, articleNumber) {
|
|
|
60
59
|
if (!resolved) {
|
|
61
60
|
throw new Error(`法令「${lawName}」が見つかりませんでした。`);
|
|
62
61
|
}
|
|
63
|
-
const
|
|
64
|
-
const article =
|
|
62
|
+
const fetched = await fetchParsedArticle(resolved.law_id, articleNumber, "structured");
|
|
63
|
+
const article = fetched?.article;
|
|
65
64
|
if (!article) {
|
|
66
65
|
throw new Error(`${resolved.title}に${formatArticleRef(articleNumber)}が見つかりませんでした。`);
|
|
67
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"article-analyzer.js","sourceRoot":"","sources":["../../src/lib/article-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"article-analyzer.js","sourceRoot":"","sources":["../../src/lib/article-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { EgovLawDataResponse, EgovRevisionInfo, ParsedArticle, StructuredArticle } from "./types.js";
|
|
2
|
+
export interface FetchedArticle<T> {
|
|
3
|
+
article: T;
|
|
4
|
+
revision?: Pick<EgovRevisionInfo, "law_revision_id" | "amendment_enforcement_date" | "current_revision_status">;
|
|
5
|
+
revisionNote?: string;
|
|
6
|
+
}
|
|
7
|
+
/** Choose the smallest API response that can satisfy the request. */
|
|
8
|
+
export declare function fetchArticleData(lawId: string, articleNumber: string): Promise<EgovLawDataResponse | null>;
|
|
9
|
+
/** Resolve amendment supplements against a matching revision only after a miss. */
|
|
10
|
+
export declare function fetchParsedArticle(lawId: string, articleNumber: string, format?: "text"): Promise<FetchedArticle<ParsedArticle> | null>;
|
|
11
|
+
export declare function fetchParsedArticle(lawId: string, articleNumber: string, format: "structured"): Promise<FetchedArticle<StructuredArticle> | null>;
|
|
12
|
+
export declare function fetchParsedArticle(lawId: string, articleNumber: string, format: "text" | "structured"): Promise<FetchedArticle<ParsedArticle | StructuredArticle> | null>;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { getLawArticle, getLawData, getLawDataByRevision, getLawRevisions, } from "./egov-client.js";
|
|
2
|
+
import { detectSpecialSection, findAmendmentSupplProvision, getSupplProvisionArticleNumbers, matchAmendLawNum, parseArticle, parseArticleStructured, toArticleElm, } from "./egov-parser.js";
|
|
3
|
+
import { ArticleNotFoundError } from "./errors.js";
|
|
4
|
+
/** Choose the smallest API response that can satisfy the request. */
|
|
5
|
+
export async function fetchArticleData(lawId, articleNumber) {
|
|
6
|
+
const elm = toArticleElm(articleNumber);
|
|
7
|
+
return elm !== null ? await getLawArticle(lawId, elm) : await getLawData(lawId);
|
|
8
|
+
}
|
|
9
|
+
export async function fetchParsedArticle(lawId, articleNumber, format = "text") {
|
|
10
|
+
const data = await fetchArticleData(lawId, articleNumber);
|
|
11
|
+
if (!data)
|
|
12
|
+
return null;
|
|
13
|
+
const parse = format === "structured" ? parseArticleStructured : parseArticle;
|
|
14
|
+
const article = parse(data.law_full_text, articleNumber);
|
|
15
|
+
if (article)
|
|
16
|
+
return { article };
|
|
17
|
+
const special = detectSpecialSection(articleNumber);
|
|
18
|
+
if (special?.type !== "suppl_amendment" &&
|
|
19
|
+
special?.type !== "suppl_amendment_article") {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
const revisions = await getLawRevisions(lawId);
|
|
23
|
+
const revision = revisions.revisions.find((entry) => entry.law_revision_id !== data.revision_info.law_revision_id &&
|
|
24
|
+
matchAmendLawNum(special.amendLawNum, entry.amendment_law_num));
|
|
25
|
+
let missingData = data;
|
|
26
|
+
if (revision) {
|
|
27
|
+
const revisionData = await getLawDataByRevision(revision.law_revision_id);
|
|
28
|
+
const revisedArticle = parse(revisionData.law_full_text, articleNumber);
|
|
29
|
+
if (revisedArticle) {
|
|
30
|
+
const metadata = {
|
|
31
|
+
law_revision_id: revision.law_revision_id,
|
|
32
|
+
amendment_enforcement_date: revision.amendment_enforcement_date,
|
|
33
|
+
current_revision_status: revision.current_revision_status,
|
|
34
|
+
};
|
|
35
|
+
const label = revision.current_revision_status === "UnEnforced"
|
|
36
|
+
? "未施行の改正"
|
|
37
|
+
: "別の改正";
|
|
38
|
+
return {
|
|
39
|
+
article: revisedArticle,
|
|
40
|
+
revision: metadata,
|
|
41
|
+
revisionNote: `※ この附則は${label}(施行日 ${revision.amendment_enforcement_date})の法令データから取得しました。`,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (findAmendmentSupplProvision(revisionData.law_full_text, special.amendLawNum)) {
|
|
45
|
+
missingData = revisionData;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (special.type === "suppl_amendment_article") {
|
|
49
|
+
const suppl = findAmendmentSupplProvision(missingData.law_full_text, special.amendLawNum);
|
|
50
|
+
if (suppl) {
|
|
51
|
+
const numbers = getSupplProvisionArticleNumbers(suppl).map((num) => {
|
|
52
|
+
const [main, ...branches] = num.split("_");
|
|
53
|
+
return `第${main}条${branches.map((branch) => `の${branch}`).join("")}`;
|
|
54
|
+
});
|
|
55
|
+
const title = missingData.revision_info.law_title;
|
|
56
|
+
const qualifier = suppl.attr?.["Extract"] === "true" ? "は抄録で、" : "には";
|
|
57
|
+
const contents = numbers.length > 0
|
|
58
|
+
? `${numbers.join("・")}のみ収録されています。`
|
|
59
|
+
: "条番号付きの条文は収録されていません。";
|
|
60
|
+
throw new ArticleNotFoundError(articleNumber, title, `${title}の附則(${special.amendLawNum})${qualifier}${contents}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=article-fetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-fetcher.js","sourceRoot":"","sources":["../../src/lib/article-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { StructuredSubitem } from "./types.js";
|
|
3
|
+
export declare const parsedArticleSchema: z.ZodObject<{
|
|
4
|
+
article_num: z.ZodString;
|
|
5
|
+
article_caption: z.ZodString;
|
|
6
|
+
article_title: z.ZodString;
|
|
7
|
+
text: z.ZodString;
|
|
8
|
+
references: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
9
|
+
raw_text: z.ZodString;
|
|
10
|
+
ref_type: z.ZodEnum<["same_law", "cross_law", "relative", "delegation", "unknown"]>;
|
|
11
|
+
target_law: z.ZodOptional<z.ZodString>;
|
|
12
|
+
target_article: z.ZodOptional<z.ZodString>;
|
|
13
|
+
target_paragraph: z.ZodOptional<z.ZodString>;
|
|
14
|
+
target_item: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
raw_text: string;
|
|
17
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
18
|
+
target_law?: string | undefined;
|
|
19
|
+
target_article?: string | undefined;
|
|
20
|
+
target_paragraph?: string | undefined;
|
|
21
|
+
target_item?: string | undefined;
|
|
22
|
+
}, {
|
|
23
|
+
raw_text: string;
|
|
24
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
25
|
+
target_law?: string | undefined;
|
|
26
|
+
target_article?: string | undefined;
|
|
27
|
+
target_paragraph?: string | undefined;
|
|
28
|
+
target_item?: string | undefined;
|
|
29
|
+
}>, "many">>;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
text: string;
|
|
32
|
+
article_num: string;
|
|
33
|
+
article_caption: string;
|
|
34
|
+
article_title: string;
|
|
35
|
+
references?: {
|
|
36
|
+
raw_text: string;
|
|
37
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
38
|
+
target_law?: string | undefined;
|
|
39
|
+
target_article?: string | undefined;
|
|
40
|
+
target_paragraph?: string | undefined;
|
|
41
|
+
target_item?: string | undefined;
|
|
42
|
+
}[] | undefined;
|
|
43
|
+
}, {
|
|
44
|
+
text: string;
|
|
45
|
+
article_num: string;
|
|
46
|
+
article_caption: string;
|
|
47
|
+
article_title: string;
|
|
48
|
+
references?: {
|
|
49
|
+
raw_text: string;
|
|
50
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
51
|
+
target_law?: string | undefined;
|
|
52
|
+
target_article?: string | undefined;
|
|
53
|
+
target_paragraph?: string | undefined;
|
|
54
|
+
target_item?: string | undefined;
|
|
55
|
+
}[] | undefined;
|
|
56
|
+
}>;
|
|
57
|
+
export declare const structuredArticleSchema: z.ZodObject<{
|
|
58
|
+
article_num: z.ZodString;
|
|
59
|
+
article_caption: z.ZodString;
|
|
60
|
+
article_title: z.ZodString;
|
|
61
|
+
paragraphs: z.ZodArray<z.ZodObject<{
|
|
62
|
+
paragraph_num: z.ZodString;
|
|
63
|
+
paragraph_sentence: z.ZodString;
|
|
64
|
+
items: z.ZodArray<z.ZodObject<{
|
|
65
|
+
item_num: z.ZodString;
|
|
66
|
+
item_title: z.ZodString;
|
|
67
|
+
item_sentence: z.ZodString;
|
|
68
|
+
subitems: z.ZodArray<z.ZodType<StructuredSubitem, z.ZodTypeDef, StructuredSubitem>, "many">;
|
|
69
|
+
}, "strip", z.ZodTypeAny, {
|
|
70
|
+
subitems: StructuredSubitem[];
|
|
71
|
+
item_num: string;
|
|
72
|
+
item_title: string;
|
|
73
|
+
item_sentence: string;
|
|
74
|
+
}, {
|
|
75
|
+
subitems: StructuredSubitem[];
|
|
76
|
+
item_num: string;
|
|
77
|
+
item_title: string;
|
|
78
|
+
item_sentence: string;
|
|
79
|
+
}>, "many">;
|
|
80
|
+
}, "strip", z.ZodTypeAny, {
|
|
81
|
+
paragraph_num: string;
|
|
82
|
+
paragraph_sentence: string;
|
|
83
|
+
items: {
|
|
84
|
+
subitems: StructuredSubitem[];
|
|
85
|
+
item_num: string;
|
|
86
|
+
item_title: string;
|
|
87
|
+
item_sentence: string;
|
|
88
|
+
}[];
|
|
89
|
+
}, {
|
|
90
|
+
paragraph_num: string;
|
|
91
|
+
paragraph_sentence: string;
|
|
92
|
+
items: {
|
|
93
|
+
subitems: StructuredSubitem[];
|
|
94
|
+
item_num: string;
|
|
95
|
+
item_title: string;
|
|
96
|
+
item_sentence: string;
|
|
97
|
+
}[];
|
|
98
|
+
}>, "many">;
|
|
99
|
+
references: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
100
|
+
raw_text: z.ZodString;
|
|
101
|
+
ref_type: z.ZodEnum<["same_law", "cross_law", "relative", "delegation", "unknown"]>;
|
|
102
|
+
target_law: z.ZodOptional<z.ZodString>;
|
|
103
|
+
target_article: z.ZodOptional<z.ZodString>;
|
|
104
|
+
target_paragraph: z.ZodOptional<z.ZodString>;
|
|
105
|
+
target_item: z.ZodOptional<z.ZodString>;
|
|
106
|
+
}, "strip", z.ZodTypeAny, {
|
|
107
|
+
raw_text: string;
|
|
108
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
109
|
+
target_law?: string | undefined;
|
|
110
|
+
target_article?: string | undefined;
|
|
111
|
+
target_paragraph?: string | undefined;
|
|
112
|
+
target_item?: string | undefined;
|
|
113
|
+
}, {
|
|
114
|
+
raw_text: string;
|
|
115
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
116
|
+
target_law?: string | undefined;
|
|
117
|
+
target_article?: string | undefined;
|
|
118
|
+
target_paragraph?: string | undefined;
|
|
119
|
+
target_item?: string | undefined;
|
|
120
|
+
}>, "many">>;
|
|
121
|
+
}, "strip", z.ZodTypeAny, {
|
|
122
|
+
article_num: string;
|
|
123
|
+
article_caption: string;
|
|
124
|
+
article_title: string;
|
|
125
|
+
paragraphs: {
|
|
126
|
+
paragraph_num: string;
|
|
127
|
+
paragraph_sentence: string;
|
|
128
|
+
items: {
|
|
129
|
+
subitems: StructuredSubitem[];
|
|
130
|
+
item_num: string;
|
|
131
|
+
item_title: string;
|
|
132
|
+
item_sentence: string;
|
|
133
|
+
}[];
|
|
134
|
+
}[];
|
|
135
|
+
references?: {
|
|
136
|
+
raw_text: string;
|
|
137
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
138
|
+
target_law?: string | undefined;
|
|
139
|
+
target_article?: string | undefined;
|
|
140
|
+
target_paragraph?: string | undefined;
|
|
141
|
+
target_item?: string | undefined;
|
|
142
|
+
}[] | undefined;
|
|
143
|
+
}, {
|
|
144
|
+
article_num: string;
|
|
145
|
+
article_caption: string;
|
|
146
|
+
article_title: string;
|
|
147
|
+
paragraphs: {
|
|
148
|
+
paragraph_num: string;
|
|
149
|
+
paragraph_sentence: string;
|
|
150
|
+
items: {
|
|
151
|
+
subitems: StructuredSubitem[];
|
|
152
|
+
item_num: string;
|
|
153
|
+
item_title: string;
|
|
154
|
+
item_sentence: string;
|
|
155
|
+
}[];
|
|
156
|
+
}[];
|
|
157
|
+
references?: {
|
|
158
|
+
raw_text: string;
|
|
159
|
+
ref_type: "same_law" | "cross_law" | "relative" | "delegation" | "unknown";
|
|
160
|
+
target_law?: string | undefined;
|
|
161
|
+
target_article?: string | undefined;
|
|
162
|
+
target_paragraph?: string | undefined;
|
|
163
|
+
target_item?: string | undefined;
|
|
164
|
+
}[] | undefined;
|
|
165
|
+
}>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const articleReferenceSchema = z.object({
|
|
3
|
+
raw_text: z.string(),
|
|
4
|
+
ref_type: z.enum([
|
|
5
|
+
"same_law",
|
|
6
|
+
"cross_law",
|
|
7
|
+
"relative",
|
|
8
|
+
"delegation",
|
|
9
|
+
"unknown",
|
|
10
|
+
]),
|
|
11
|
+
target_law: z.string().optional(),
|
|
12
|
+
target_article: z.string().optional(),
|
|
13
|
+
target_paragraph: z.string().optional(),
|
|
14
|
+
target_item: z.string().optional(),
|
|
15
|
+
});
|
|
16
|
+
export const parsedArticleSchema = z.object({
|
|
17
|
+
article_num: z.string(),
|
|
18
|
+
article_caption: z.string(),
|
|
19
|
+
article_title: z.string(),
|
|
20
|
+
text: z.string(),
|
|
21
|
+
references: z.array(articleReferenceSchema).optional(),
|
|
22
|
+
});
|
|
23
|
+
const structuredSubitemSchema = z.lazy(() => z.object({
|
|
24
|
+
subitem_num: z.string(),
|
|
25
|
+
subitem_title: z.string(),
|
|
26
|
+
subitem_sentence: z.string(),
|
|
27
|
+
subitems: z.array(structuredSubitemSchema),
|
|
28
|
+
}));
|
|
29
|
+
const structuredItemSchema = z.object({
|
|
30
|
+
item_num: z.string(),
|
|
31
|
+
item_title: z.string(),
|
|
32
|
+
item_sentence: z.string(),
|
|
33
|
+
subitems: z.array(structuredSubitemSchema),
|
|
34
|
+
});
|
|
35
|
+
const structuredParagraphSchema = z.object({
|
|
36
|
+
paragraph_num: z.string(),
|
|
37
|
+
paragraph_sentence: z.string(),
|
|
38
|
+
items: z.array(structuredItemSchema),
|
|
39
|
+
});
|
|
40
|
+
export const structuredArticleSchema = z.object({
|
|
41
|
+
article_num: z.string(),
|
|
42
|
+
article_caption: z.string(),
|
|
43
|
+
article_title: z.string(),
|
|
44
|
+
paragraphs: z.array(structuredParagraphSchema),
|
|
45
|
+
references: z.array(articleReferenceSchema).optional(),
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=article-schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"article-schemas.js","sourceRoot":"","sources":["../../src/lib/article-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC;QACf,UAAU;QACV,WAAW;QACX,UAAU;QACV,YAAY;QACZ,SAAS;KACV,CAAC;IACF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAiC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CACxE,CAAC,CAAC,MAAM,CAAC;IACP,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC,CACH,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC;CAC3C,CAAC,CAAC;AAEH,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE;IAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;CACrC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE;IAC3B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC;IAC9C,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE;CACvD,CAAC,CAAC"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { formatArticleRef } from "./errors.js";
|
|
1
|
+
import { fetchParsedArticle } from "./article-fetcher.js";
|
|
2
|
+
import { ArticleNotFoundError, formatArticleRef } from "./errors.js";
|
|
4
3
|
import { resolveLawId } from "./law-resolver.js";
|
|
5
4
|
const MAX_PREVIEW_LENGTH = 200;
|
|
6
5
|
/**
|
|
@@ -86,8 +85,8 @@ export async function verifyCitation(lawName, articleNumber, claimedText) {
|
|
|
86
85
|
error_message: `法令「${lawName}」が見つかりませんでした。`,
|
|
87
86
|
};
|
|
88
87
|
}
|
|
89
|
-
const
|
|
90
|
-
const article =
|
|
88
|
+
const fetched = await fetchParsedArticle(resolved.law_id, articleNumber, "text");
|
|
89
|
+
const article = fetched?.article;
|
|
91
90
|
if (!article) {
|
|
92
91
|
return {
|
|
93
92
|
law_name: resolved.title,
|
|
@@ -131,7 +130,7 @@ export async function verifyCitation(lawName, articleNumber, claimedText) {
|
|
|
131
130
|
return {
|
|
132
131
|
law_name: lawName,
|
|
133
132
|
article_number: articleNumber,
|
|
134
|
-
status: "error",
|
|
133
|
+
status: error instanceof ArticleNotFoundError ? "article_not_found" : "error",
|
|
135
134
|
error_message: error instanceof Error ? error.message : String(error),
|
|
136
135
|
};
|
|
137
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"citation-verifier.js","sourceRoot":"","sources":["../../src/lib/citation-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"citation-verifier.js","sourceRoot":"","sources":["../../src/lib/citation-verifier.ts"],"names":[],"mappings":"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"}
|