qfai 0.4.7 → 0.5.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/README.md +10 -2
- package/assets/init/.qfai/README.md +3 -0
- package/assets/init/.qfai/promptpack/commands/implement.md +2 -0
- package/assets/init/.qfai/promptpack/commands/plan.md +2 -0
- package/assets/init/.qfai/promptpack/commands/review.md +1 -0
- package/assets/init/.qfai/promptpack/steering/traceability.md +6 -1
- package/assets/init/.qfai/prompts/README.md +16 -0
- package/assets/init/.qfai/prompts/qfai-classify-change.md +33 -0
- package/assets/init/.qfai/prompts/qfai-maintain-contracts.md +35 -0
- package/assets/init/.qfai/prompts/qfai-maintain-traceability.md +36 -0
- package/dist/cli/index.cjs +26 -7
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.ts +0 -2
- package/dist/cli/index.mjs +26 -7
- package/dist/cli/index.mjs.map +1 -1
- package/dist/index.cjs +26 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +168 -2
- package/dist/index.mjs +26 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
- package/dist/cli/commands/init.d.ts +0 -8
- package/dist/cli/commands/init.d.ts.map +0 -1
- package/dist/cli/commands/init.js +0 -30
- package/dist/cli/commands/init.js.map +0 -1
- package/dist/cli/commands/report.d.ts +0 -7
- package/dist/cli/commands/report.d.ts.map +0 -1
- package/dist/cli/commands/report.js +0 -108
- package/dist/cli/commands/report.js.map +0 -1
- package/dist/cli/commands/validate.d.ts +0 -9
- package/dist/cli/commands/validate.d.ts.map +0 -1
- package/dist/cli/commands/validate.js +0 -57
- package/dist/cli/commands/validate.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js +0 -7
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/lib/args.d.ts +0 -18
- package/dist/cli/lib/args.d.ts.map +0 -1
- package/dist/cli/lib/args.js +0 -98
- package/dist/cli/lib/args.js.map +0 -1
- package/dist/cli/lib/assets.d.ts +0 -2
- package/dist/cli/lib/assets.d.ts.map +0 -1
- package/dist/cli/lib/assets.js +0 -24
- package/dist/cli/lib/assets.js.map +0 -1
- package/dist/cli/lib/failOn.d.ts +0 -5
- package/dist/cli/lib/failOn.d.ts.map +0 -1
- package/dist/cli/lib/failOn.js +0 -10
- package/dist/cli/lib/failOn.js.map +0 -1
- package/dist/cli/lib/fs.d.ts +0 -11
- package/dist/cli/lib/fs.d.ts.map +0 -1
- package/dist/cli/lib/fs.js +0 -91
- package/dist/cli/lib/fs.js.map +0 -1
- package/dist/cli/lib/logger.d.ts +0 -4
- package/dist/cli/lib/logger.d.ts.map +0 -1
- package/dist/cli/lib/logger.js +0 -10
- package/dist/cli/lib/logger.js.map +0 -1
- package/dist/cli/main.d.ts +0 -2
- package/dist/cli/main.d.ts.map +0 -1
- package/dist/cli/main.js +0 -66
- package/dist/cli/main.js.map +0 -1
- package/dist/core/config.d.ts +0 -47
- package/dist/core/config.d.ts.map +0 -1
- package/dist/core/config.js +0 -224
- package/dist/core/config.js.map +0 -1
- package/dist/core/contractIndex.d.ts +0 -12
- package/dist/core/contractIndex.d.ts.map +0 -1
- package/dist/core/contractIndex.js +0 -38
- package/dist/core/contractIndex.js.map +0 -1
- package/dist/core/contracts.d.ts +0 -5
- package/dist/core/contracts.d.ts.map +0 -1
- package/dist/core/contracts.js +0 -42
- package/dist/core/contracts.js.map +0 -1
- package/dist/core/contractsDecl.d.ts +0 -3
- package/dist/core/contractsDecl.d.ts.map +0 -1
- package/dist/core/contractsDecl.js +0 -19
- package/dist/core/contractsDecl.js.map +0 -1
- package/dist/core/discovery.d.ts +0 -14
- package/dist/core/discovery.d.ts.map +0 -1
- package/dist/core/discovery.js +0 -55
- package/dist/core/discovery.js.map +0 -1
- package/dist/core/fs.d.ts +0 -11
- package/dist/core/fs.d.ts.map +0 -1
- package/dist/core/fs.js +0 -68
- package/dist/core/fs.js.map +0 -1
- package/dist/core/gherkin/parse.d.ts +0 -7
- package/dist/core/gherkin/parse.d.ts.map +0 -1
- package/dist/core/gherkin/parse.js +0 -25
- package/dist/core/gherkin/parse.js.map +0 -1
- package/dist/core/ids.d.ts +0 -6
- package/dist/core/ids.d.ts.map +0 -1
- package/dist/core/ids.js +0 -52
- package/dist/core/ids.js.map +0 -1
- package/dist/core/index.d.ts +0 -13
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -13
- package/dist/core/index.js.map +0 -1
- package/dist/core/parse/adr.d.ts +0 -13
- package/dist/core/parse/adr.d.ts.map +0 -1
- package/dist/core/parse/adr.js +0 -33
- package/dist/core/parse/adr.js.map +0 -1
- package/dist/core/parse/gherkin.d.ts +0 -12
- package/dist/core/parse/gherkin.d.ts.map +0 -1
- package/dist/core/parse/gherkin.js +0 -22
- package/dist/core/parse/gherkin.js.map +0 -1
- package/dist/core/parse/markdown.d.ts +0 -14
- package/dist/core/parse/markdown.d.ts.map +0 -1
- package/dist/core/parse/markdown.js +0 -45
- package/dist/core/parse/markdown.js.map +0 -1
- package/dist/core/parse/spec.d.ts +0 -36
- package/dist/core/parse/spec.d.ts.map +0 -1
- package/dist/core/parse/spec.js +0 -123
- package/dist/core/parse/spec.js.map +0 -1
- package/dist/core/report.d.ts +0 -55
- package/dist/core/report.d.ts.map +0 -1
- package/dist/core/report.js +0 -393
- package/dist/core/report.js.map +0 -1
- package/dist/core/scenarioModel.d.ts +0 -33
- package/dist/core/scenarioModel.d.ts.map +0 -1
- package/dist/core/scenarioModel.js +0 -128
- package/dist/core/scenarioModel.js.map +0 -1
- package/dist/core/specLayout.d.ts +0 -8
- package/dist/core/specLayout.d.ts.map +0 -1
- package/dist/core/specLayout.js +0 -36
- package/dist/core/specLayout.js.map +0 -1
- package/dist/core/traceability.d.ts +0 -26
- package/dist/core/traceability.d.ts.map +0 -1
- package/dist/core/traceability.js +0 -157
- package/dist/core/traceability.js.map +0 -1
- package/dist/core/types.d.ts +0 -31
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -2
- package/dist/core/types.js.map +0 -1
- package/dist/core/validate.d.ts +0 -4
- package/dist/core/validate.d.ts.map +0 -1
- package/dist/core/validate.js +0 -45
- package/dist/core/validate.js.map +0 -1
- package/dist/core/validators/contracts.d.ts +0 -5
- package/dist/core/validators/contracts.d.ts.map +0 -1
- package/dist/core/validators/contracts.js +0 -189
- package/dist/core/validators/contracts.js.map +0 -1
- package/dist/core/validators/delta.d.ts +0 -4
- package/dist/core/validators/delta.d.ts.map +0 -1
- package/dist/core/validators/delta.js +0 -68
- package/dist/core/validators/delta.js.map +0 -1
- package/dist/core/validators/ids.d.ts +0 -4
- package/dist/core/validators/ids.d.ts.map +0 -1
- package/dist/core/validators/ids.js +0 -88
- package/dist/core/validators/ids.js.map +0 -1
- package/dist/core/validators/scenario.d.ts +0 -5
- package/dist/core/validators/scenario.d.ts.map +0 -1
- package/dist/core/validators/scenario.js +0 -127
- package/dist/core/validators/scenario.js.map +0 -1
- package/dist/core/validators/spec.d.ts +0 -5
- package/dist/core/validators/spec.d.ts.map +0 -1
- package/dist/core/validators/spec.js +0 -94
- package/dist/core/validators/spec.js.map +0 -1
- package/dist/core/validators/traceability.d.ts +0 -4
- package/dist/core/validators/traceability.d.ts.map +0 -1
- package/dist/core/validators/traceability.js +0 -222
- package/dist/core/validators/traceability.js.map +0 -1
- package/dist/core/version.d.ts +0 -2
- package/dist/core/version.d.ts.map +0 -1
- package/dist/core/version.js +0 -25
- package/dist/core/version.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ npx qfai report
|
|
|
18
18
|
|
|
19
19
|
## できること
|
|
20
20
|
|
|
21
|
-
- `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/require-to-spec.md`、`.qfai/promptpack/` を含む)
|
|
21
|
+
- `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/require-to-spec.md`、`.qfai/prompts/qfai-generate-test-globs.md`、`.qfai/prompts/qfai-maintain-traceability.md`、`.qfai/prompts/qfai-maintain-contracts.md`、`.qfai/prompts/qfai-classify-change.md`、`.qfai/promptpack/` を含む)
|
|
22
22
|
- `npx qfai validate` による `.qfai/` 内ドキュメントの整合性・トレーサビリティ検査
|
|
23
23
|
- `npx qfai validate` による SC→Test 参照の検証(`validation.traceability.testFileGlobs` に一致するテストファイルから `QFAI:SC-xxxx` を抽出)
|
|
24
24
|
- `npx qfai report` によるレポート出力
|
|
@@ -42,10 +42,18 @@ Contract ID prefix は `UI-0001` / `API-0001` / `DB-0001` です。
|
|
|
42
42
|
契約関連の検証は `validation.traceability` で制御します。
|
|
43
43
|
|
|
44
44
|
- `validation.traceability.allowOrphanContracts`: Spec から参照されない契約の許可(default: `false`)
|
|
45
|
-
- `validation.traceability.unknownContractIdSeverity`:
|
|
45
|
+
- `validation.traceability.unknownContractIdSeverity`: Scenario が参照した契約 ID が存在しない場合の severity(default: `error`、`error` / `warning` のみ)
|
|
46
|
+
- Spec の `QFAI-CONTRACT-REF` が未知 ID を参照した場合は常に error(`QFAI-TRACE-021`)
|
|
47
|
+
- `unknownContractIdSeverity` は Scenario 側(`QFAI-TRACE-008`)のみを制御
|
|
46
48
|
|
|
47
49
|
`npx qfai init` は `.qfai/contracts/` 配下に UI/API/DB のサンプルを生成します。
|
|
48
50
|
|
|
51
|
+
## CI と Hard Gate
|
|
52
|
+
|
|
53
|
+
- 「CIで検出する」= `validate` が issue を出す(info/warning/error を含む)
|
|
54
|
+
- 「Hard Gate」= `--fail-on error` で CI を停止する領域
|
|
55
|
+
- Spec→下流参照禁止は Hard Gate にしない(検出する場合でも warning に留める)
|
|
56
|
+
|
|
49
57
|
SC→Test の参照はテストコード内の `QFAI:SC-xxxx` アノテーションで宣言します。
|
|
50
58
|
SC→Test の対象ファイルは `validation.traceability.testFileGlobs` で指定します。
|
|
51
59
|
除外は `validation.traceability.testFileExcludeGlobs` で指定できます。
|
|
@@ -34,6 +34,9 @@ npx qfai report
|
|
|
34
34
|
- `prompts/README.md`
|
|
35
35
|
- `prompts/require-to-spec.md`
|
|
36
36
|
- `prompts/qfai-generate-test-globs.md`
|
|
37
|
+
- `prompts/qfai-maintain-traceability.md`
|
|
38
|
+
- `prompts/qfai-maintain-contracts.md`
|
|
39
|
+
- `prompts/qfai-classify-change.md`
|
|
37
40
|
- `promptpack/constitution.md`
|
|
38
41
|
- `out/README.md`
|
|
39
42
|
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
参照は下流→上流のみを許可する(下流参照禁止の対象はテスト/実装)。
|
|
4
4
|
|
|
5
|
+
## 用語(CI と Hard Gate)
|
|
6
|
+
|
|
7
|
+
- 「CIで検出する」: validate が issue を出す(info/warning/error を含む)
|
|
8
|
+
- 「Hard Gate」: `--fail-on error` で CI を止める領域
|
|
9
|
+
|
|
5
10
|
- Spec は QFAI-CONTRACT-REF で契約IDを宣言する(none可、宣言行は必須)
|
|
6
11
|
- Scenario は @SPEC-xxxx / @SC-xxxx / @BR-xxxx を持つ(契約ID参照は任意)
|
|
7
12
|
- テスト/コードは QFAI:SC-xxxx で SC を参照する
|
|
@@ -16,4 +21,4 @@
|
|
|
16
21
|
|
|
17
22
|
## CIで検出しないため運用で担保する範囲
|
|
18
23
|
|
|
19
|
-
- Spec
|
|
24
|
+
- Spec→下流参照禁止(検出する場合でも warning に留め、Hard Gate 化しない)
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
## 目的
|
|
6
6
|
|
|
7
7
|
- Spec から overview / Business Flow を生成するための素材
|
|
8
|
+
- トレーサビリティ/契約/変更区分の運用支援(CIで止めない領域)
|
|
8
9
|
- 将来(v0.9)の adapter/emit 実装に備えた配布物
|
|
9
10
|
|
|
10
11
|
## プロンプト一覧
|
|
@@ -13,6 +14,21 @@
|
|
|
13
14
|
- `makeBusinessFlow.md`: 業務フロー(BF)整理
|
|
14
15
|
- `require-to-spec.md`: 既存要件から Spec Pack を起こす
|
|
15
16
|
- `qfai-generate-test-globs.md`: テストファイル glob の生成支援(`qfai.config.yaml` 更新)
|
|
17
|
+
- `qfai-maintain-traceability.md`: 参照切れの修復(Spec/Scenario/Test)
|
|
18
|
+
- `qfai-maintain-contracts.md`: 契約 ID と参照の整合
|
|
19
|
+
- `qfai-classify-change.md`: Compatibility / Change 分類支援
|
|
20
|
+
|
|
21
|
+
## 使い分け表
|
|
22
|
+
|
|
23
|
+
| Prompt | 目的 | 必須入力 | 出力の期待形式 | よくある失敗 |
|
|
24
|
+
| ------------------------------- | ---------------- | --------------------------------------------- | ------------------------------ | ------------------- |
|
|
25
|
+
| `qfai-maintain-traceability.md` | 参照切れの修復 | spec/delta/scenario + validate/report + tests | 修正方針 + diff + 再実行手順 | ID形式崩し/SSOT無視 |
|
|
26
|
+
| `qfai-maintain-contracts.md` | 契約と参照の整合 | contracts + spec + report | 採番案 + 参照更新案 + diff | ID変更の無断実施 |
|
|
27
|
+
| `qfai-classify-change.md` | 変更区分の判断 | delta.md + 変更差分 | 分類 + 根拠 + 影響範囲 | 根拠なし分類 |
|
|
28
|
+
| `qfai-generate-test-globs.md` | テストglob生成 | package.json/設定/テスト配置 | glob案 + 更新案 + サンプル確認 | glob過剰/不足 |
|
|
29
|
+
| `makeOverview.md` | Spec一覧生成 | spec.md | 一覧テーブル/サマリ | spec未読 |
|
|
30
|
+
| `makeBusinessFlow.md` | 業務フロー整理 | spec.md/要件 | フロー手順/根拠 | 要件の飛ばし |
|
|
31
|
+
| `require-to-spec.md` | 要件からSpec作成 | require資料 | Spec Pack草案 | ID採番の逸脱 |
|
|
16
32
|
|
|
17
33
|
## 使い方(例)
|
|
18
34
|
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# QFAI: Compatibility / Change 分類(変更区分の判断支援)
|
|
2
|
+
|
|
3
|
+
あなたは差分を分析し、変更が Compatibility か Change かを分類します。
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
- delta.md の変更区分を明確にし、レビューポイントを固定する
|
|
8
|
+
- 影響範囲(Spec/Scenario/Test/Contract)を明示する
|
|
9
|
+
|
|
10
|
+
## 必須入力
|
|
11
|
+
|
|
12
|
+
- `.qfai/specs/**/delta.md`
|
|
13
|
+
- 変更差分(`git diff`)
|
|
14
|
+
- 参照元の Spec/Scenario/Contracts(必要に応じて)
|
|
15
|
+
|
|
16
|
+
## 手順
|
|
17
|
+
|
|
18
|
+
1. 差分を読み、ユーザー影響(互換維持/破壊)を分類する。
|
|
19
|
+
2. 影響範囲(Spec/Scenario/Test/Contract)を列挙する。
|
|
20
|
+
3. 変更区分の根拠を簡潔にまとめる。
|
|
21
|
+
4. 必要なドキュメント更新(README/CHANGELOG/Spec)を列挙する。
|
|
22
|
+
|
|
23
|
+
## 禁止事項
|
|
24
|
+
|
|
25
|
+
- 仕様を勝手に変更しない
|
|
26
|
+
- delta.md の内容を無断で上書きしない
|
|
27
|
+
- 変更理由の捏造をしない
|
|
28
|
+
|
|
29
|
+
## 出力フォーマット
|
|
30
|
+
|
|
31
|
+
- 分類(Compatibility / Change)と根拠
|
|
32
|
+
- 影響範囲(ファイル/機能/テスト)
|
|
33
|
+
- 追記すべきドキュメントのチェックリスト
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# QFAI: 契約保守(Contract ID と Spec 参照の整合)
|
|
2
|
+
|
|
3
|
+
あなたは契約ファイルの追加/変更に合わせて、ID と参照の整合を保ちます。
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
- `QFAI-CONTRACT-ID` と `QFAI-CONTRACT-REF` の整合を保つ
|
|
8
|
+
- orphan contract を発生させずに運用できるようにする
|
|
9
|
+
|
|
10
|
+
## 必須入力
|
|
11
|
+
|
|
12
|
+
- `.qfai/contracts/**`(追加/変更した契約)
|
|
13
|
+
- 関連する `spec.md`(候補は report の Spec→契約一覧)
|
|
14
|
+
- `.qfai/out/report.md` / `.qfai/out/validate.json`(あれば)
|
|
15
|
+
|
|
16
|
+
## 手順
|
|
17
|
+
|
|
18
|
+
1. 追加/変更した契約の種別(UI/API/DB)と命名規約を確認する。
|
|
19
|
+
2. `QFAI-CONTRACT-ID` の採番案を作り、ファイル名と一致させる。
|
|
20
|
+
3. 参照すべき Spec を特定し、`QFAI-CONTRACT-REF` へ追記案を作る。
|
|
21
|
+
4. orphan contract が出る場合は、Spec 追加/更新の方針を提示する。
|
|
22
|
+
5. 変更後の validate / report 手順を示す。
|
|
23
|
+
|
|
24
|
+
## 禁止事項
|
|
25
|
+
|
|
26
|
+
- 既存の Contract ID を無断で変更しない
|
|
27
|
+
- ID 形式(`UI|API|DB-0001`)を崩さない
|
|
28
|
+
- allowOrphanContracts の変更を無断で行わない
|
|
29
|
+
|
|
30
|
+
## 出力フォーマット
|
|
31
|
+
|
|
32
|
+
- 追加/変更する Contract ID と根拠
|
|
33
|
+
- 参照を追加する Spec 一覧と編集案
|
|
34
|
+
- 提案 diff(またはパッチ単位)
|
|
35
|
+
- 再実行コマンド(`qfai validate` / `qfai report`)
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# QFAI: トレーサビリティ保守(Spec/Scenario/Test の参照整合)
|
|
2
|
+
|
|
3
|
+
あなたは QFAI の成果物を分析し、壊れた参照(Spec/Scenario/Test)を修復します。
|
|
4
|
+
|
|
5
|
+
## 目的
|
|
6
|
+
|
|
7
|
+
- Spec/Scenario/Test の ID 参照が壊れた箇所を特定し、整合させる
|
|
8
|
+
- 互換維持/変更(Compatibility/Change)の区分を明確にする
|
|
9
|
+
|
|
10
|
+
## 必須入力
|
|
11
|
+
|
|
12
|
+
- `.qfai/specs/**/spec.md` / `scenario.md` / `delta.md`
|
|
13
|
+
- `.qfai/out/validate.json`(あれば)
|
|
14
|
+
- `.qfai/out/report.md`(あれば)
|
|
15
|
+
- テストコード(`validation.traceability.testFileGlobs` に一致する範囲)
|
|
16
|
+
|
|
17
|
+
## 手順
|
|
18
|
+
|
|
19
|
+
1. validate/report の結果から、壊れている参照(Spec/BR/SC/Contract/Test)を列挙する。
|
|
20
|
+
2. Spec Pack(spec/delta/scenario)を読み、ID と参照の意図を把握する。
|
|
21
|
+
3. 修正が Compatibility か Change かを判断し、根拠を整理する。
|
|
22
|
+
4. 参照切れを解消する最小修正案(Spec/Scenario/Test)を作る。
|
|
23
|
+
5. 変更後の validate / report 手順を示す。
|
|
24
|
+
|
|
25
|
+
## 禁止事項
|
|
26
|
+
|
|
27
|
+
- 仕様の勝手な拡張や要件追加をしない
|
|
28
|
+
- ID 形式(`PREFIX-0001`)を崩さない
|
|
29
|
+
- 参照の SSOT を変更しない(Spec→Contract は Spec の `QFAI-CONTRACT-REF` が正)
|
|
30
|
+
|
|
31
|
+
## 出力フォーマット
|
|
32
|
+
|
|
33
|
+
- 変更区分(Compatibility / Change)と根拠
|
|
34
|
+
- 修正対象一覧(ファイル/ID/理由)
|
|
35
|
+
- 提案 diff(またはパッチ単位)
|
|
36
|
+
- 再実行コマンド(`qfai validate` / `qfai report` / テスト)
|
package/dist/cli/index.cjs
CHANGED
|
@@ -1280,8 +1280,8 @@ var import_promises8 = require("fs/promises");
|
|
|
1280
1280
|
var import_node_path9 = __toESM(require("path"), 1);
|
|
1281
1281
|
var import_node_url2 = require("url");
|
|
1282
1282
|
async function resolveToolVersion() {
|
|
1283
|
-
if ("0.
|
|
1284
|
-
return "0.
|
|
1283
|
+
if ("0.5.0".length > 0) {
|
|
1284
|
+
return "0.5.0";
|
|
1285
1285
|
}
|
|
1286
1286
|
try {
|
|
1287
1287
|
const packagePath = resolvePackageJsonPath();
|
|
@@ -2624,8 +2624,11 @@ async function createReportData(root, validation, configResult) {
|
|
|
2624
2624
|
db: dbFiles
|
|
2625
2625
|
} = await collectContractFiles(uiRoot, apiRoot, dbRoot);
|
|
2626
2626
|
const contractIndex = await buildContractIndex(root, config);
|
|
2627
|
-
const specContractRefs = await collectSpecContractRefs(specFiles);
|
|
2628
2627
|
const contractIdList = Array.from(contractIndex.ids);
|
|
2628
|
+
const specContractRefs = await collectSpecContractRefs(
|
|
2629
|
+
specFiles,
|
|
2630
|
+
contractIdList
|
|
2631
|
+
);
|
|
2629
2632
|
const referencedContracts = /* @__PURE__ */ new Set();
|
|
2630
2633
|
for (const ids of specContractRefs.specToContractIds.values()) {
|
|
2631
2634
|
ids.forEach((id) => referencedContracts.add(id));
|
|
@@ -2706,6 +2709,7 @@ async function createReportData(root, validation, configResult) {
|
|
|
2706
2709
|
},
|
|
2707
2710
|
specs: {
|
|
2708
2711
|
contractRefMissing: specContractRefs.missingRefSpecs.size,
|
|
2712
|
+
missingRefSpecs: toSortedArray2(specContractRefs.missingRefSpecs),
|
|
2709
2713
|
specToContractIds: specToContractIdsRecord
|
|
2710
2714
|
}
|
|
2711
2715
|
},
|
|
@@ -2788,6 +2792,16 @@ function formatReportMarkdown(data) {
|
|
|
2788
2792
|
}
|
|
2789
2793
|
}
|
|
2790
2794
|
lines.push("");
|
|
2795
|
+
lines.push("## Spec\u3067 contract-ref \u672A\u5BA3\u8A00");
|
|
2796
|
+
const missingRefSpecs = data.traceability.specs.missingRefSpecs;
|
|
2797
|
+
if (missingRefSpecs.length === 0) {
|
|
2798
|
+
lines.push("- (none)");
|
|
2799
|
+
} else {
|
|
2800
|
+
for (const specId of missingRefSpecs) {
|
|
2801
|
+
lines.push(`- ${specId}`);
|
|
2802
|
+
}
|
|
2803
|
+
}
|
|
2804
|
+
lines.push("");
|
|
2791
2805
|
lines.push("## SC\u30AB\u30D0\u30EC\u30C3\u30B8");
|
|
2792
2806
|
lines.push(`- total: ${data.traceability.sc.total}`);
|
|
2793
2807
|
lines.push(`- covered: ${data.traceability.sc.covered}`);
|
|
@@ -2891,10 +2905,13 @@ function formatReportMarkdown(data) {
|
|
|
2891
2905
|
function formatReportJson(data) {
|
|
2892
2906
|
return JSON.stringify(data, null, 2);
|
|
2893
2907
|
}
|
|
2894
|
-
async function collectSpecContractRefs(specFiles) {
|
|
2908
|
+
async function collectSpecContractRefs(specFiles, contractIdList) {
|
|
2895
2909
|
const specToContractIds = /* @__PURE__ */ new Map();
|
|
2896
2910
|
const idToSpecs = /* @__PURE__ */ new Map();
|
|
2897
2911
|
const missingRefSpecs = /* @__PURE__ */ new Set();
|
|
2912
|
+
for (const contractId of contractIdList) {
|
|
2913
|
+
idToSpecs.set(contractId, /* @__PURE__ */ new Set());
|
|
2914
|
+
}
|
|
2898
2915
|
for (const file of specFiles) {
|
|
2899
2916
|
const text = await (0, import_promises15.readFile)(file, "utf-8");
|
|
2900
2917
|
const parsed = parseSpec(text, file);
|
|
@@ -2902,13 +2919,15 @@ async function collectSpecContractRefs(specFiles) {
|
|
|
2902
2919
|
const refs = parsed.contractRefs;
|
|
2903
2920
|
if (refs.lines.length === 0) {
|
|
2904
2921
|
missingRefSpecs.add(specKey);
|
|
2922
|
+
continue;
|
|
2905
2923
|
}
|
|
2906
2924
|
const currentContracts = specToContractIds.get(specKey) ?? /* @__PURE__ */ new Set();
|
|
2907
2925
|
for (const id of refs.ids) {
|
|
2908
2926
|
currentContracts.add(id);
|
|
2909
|
-
const specs = idToSpecs.get(id)
|
|
2910
|
-
specs
|
|
2911
|
-
|
|
2927
|
+
const specs = idToSpecs.get(id);
|
|
2928
|
+
if (specs) {
|
|
2929
|
+
specs.add(specKey);
|
|
2930
|
+
}
|
|
2912
2931
|
}
|
|
2913
2932
|
specToContractIds.set(specKey, currentContracts);
|
|
2914
2933
|
}
|