qfai 0.4.0 → 0.4.4

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 (77) hide show
  1. package/README.md +20 -1
  2. package/assets/init/.qfai/README.md +3 -1
  3. package/assets/init/.qfai/contracts/README.md +17 -8
  4. package/assets/init/.qfai/contracts/api/api-0001-sample.yaml +3 -2
  5. package/assets/init/.qfai/contracts/db/db-0001-sample.sql +2 -1
  6. package/assets/init/.qfai/contracts/ui/ui-0001-sample.yaml +3 -1
  7. package/assets/init/.qfai/promptpack/modes/change.md +3 -2
  8. package/assets/init/.qfai/promptpack/modes/compatibility.md +2 -0
  9. package/assets/init/.qfai/prompts/README.md +1 -0
  10. package/assets/init/.qfai/prompts/qfai-generate-test-globs.md +29 -0
  11. package/assets/init/.qfai/prompts/require-to-spec.md +4 -2
  12. package/assets/init/.qfai/specs/README.md +9 -2
  13. package/assets/init/.qfai/specs/spec-0001/spec.md +2 -0
  14. package/assets/init/root/qfai.config.yaml +6 -1
  15. package/assets/init/root/tests/qfai-traceability.sample.test.ts +2 -2
  16. package/dist/cli/index.cjs +885 -489
  17. package/dist/cli/index.cjs.map +1 -1
  18. package/dist/cli/index.mjs +885 -489
  19. package/dist/cli/index.mjs.map +1 -1
  20. package/dist/core/config.d.ts +2 -1
  21. package/dist/core/config.d.ts.map +1 -1
  22. package/dist/core/config.js +4 -2
  23. package/dist/core/config.js.map +1 -1
  24. package/dist/core/contractIndex.d.ts +1 -2
  25. package/dist/core/contractIndex.d.ts.map +1 -1
  26. package/dist/core/contractIndex.js +10 -38
  27. package/dist/core/contractIndex.js.map +1 -1
  28. package/dist/core/contractsDecl.d.ts +3 -0
  29. package/dist/core/contractsDecl.d.ts.map +1 -0
  30. package/dist/core/contractsDecl.js +19 -0
  31. package/dist/core/contractsDecl.js.map +1 -0
  32. package/dist/core/fs.d.ts +5 -0
  33. package/dist/core/fs.d.ts.map +1 -1
  34. package/dist/core/fs.js +13 -0
  35. package/dist/core/fs.js.map +1 -1
  36. package/dist/core/ids.d.ts +1 -1
  37. package/dist/core/ids.d.ts.map +1 -1
  38. package/dist/core/ids.js +3 -3
  39. package/dist/core/ids.js.map +1 -1
  40. package/dist/core/parse/spec.d.ts +8 -0
  41. package/dist/core/parse/spec.d.ts.map +1 -1
  42. package/dist/core/parse/spec.js +43 -0
  43. package/dist/core/parse/spec.js.map +1 -1
  44. package/dist/core/report.d.ts +16 -2
  45. package/dist/core/report.d.ts.map +1 -1
  46. package/dist/core/report.js +144 -11
  47. package/dist/core/report.js.map +1 -1
  48. package/dist/core/scenarioModel.d.ts.map +1 -1
  49. package/dist/core/scenarioModel.js +3 -5
  50. package/dist/core/scenarioModel.js.map +1 -1
  51. package/dist/core/traceability.d.ts +15 -1
  52. package/dist/core/traceability.d.ts.map +1 -1
  53. package/dist/core/traceability.js +96 -9
  54. package/dist/core/traceability.js.map +1 -1
  55. package/dist/core/types.d.ts +6 -0
  56. package/dist/core/types.d.ts.map +1 -1
  57. package/dist/core/validate.d.ts.map +1 -1
  58. package/dist/core/validate.js +12 -1
  59. package/dist/core/validate.js.map +1 -1
  60. package/dist/core/validators/contracts.d.ts.map +1 -1
  61. package/dist/core/validators/contracts.js +45 -18
  62. package/dist/core/validators/contracts.js.map +1 -1
  63. package/dist/core/validators/scenario.d.ts.map +1 -1
  64. package/dist/core/validators/scenario.js +2 -15
  65. package/dist/core/validators/scenario.js.map +1 -1
  66. package/dist/core/validators/spec.js +1 -1
  67. package/dist/core/validators/spec.js.map +1 -1
  68. package/dist/core/validators/traceability.d.ts.map +1 -1
  69. package/dist/core/validators/traceability.js +66 -34
  70. package/dist/core/validators/traceability.js.map +1 -1
  71. package/dist/index.cjs +869 -473
  72. package/dist/index.cjs.map +1 -1
  73. package/dist/index.d.cts +37 -12
  74. package/dist/index.mjs +869 -473
  75. package/dist/index.mjs.map +1 -1
  76. package/dist/tsconfig.tsbuildinfo +1 -1
  77. package/package.json +2 -1
package/README.md CHANGED
@@ -20,7 +20,7 @@ npx qfai report
20
20
 
21
21
  - `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/require-to-spec.md`、`.qfai/promptpack/` を含む)
22
22
  - `npx qfai validate` による `.qfai/` 内ドキュメントの整合性・トレーサビリティ検査
23
- - `npx qfai validate` による SC→Test 参照の検証(`tests/` 配下を走査)
23
+ - `npx qfai validate` による SC→Test 参照の検証(`validation.traceability.testFileGlobs` に一致するテストファイルから `QFAI:SC-xxxx` を抽出)
24
24
  - `npx qfai report` によるレポート出力
25
25
 
26
26
  ## Usage
@@ -32,8 +32,27 @@ npx qfai report
32
32
  設定はリポジトリ直下の `qfai.config.yaml` で行います。
33
33
  命名規約は `docs/rules/naming.md` を参照してください。
34
34
 
35
+ ## Contracts
36
+
37
+ Spec では `QFAI-CONTRACT-REF:` 行で参照する契約IDを宣言します(`none` 可、宣言行は必須)。
38
+ 契約ファイルは `QFAI-CONTRACT-ID: <ID>` を **1ファイル1ID** で宣言します。
39
+ Contract ID prefix は `UI-0001` / `API-0001` / `DB-0001` です。
40
+ 宣言では大文字(`UI-0001`)、ファイル名は小文字(`ui-0001-...`)を使用します。
41
+
42
+ 契約関連の検証は `validation.traceability` で制御します。
43
+
44
+ - `validation.traceability.allowOrphanContracts`: Spec から参照されない契約の許可(default: `false`)
45
+ - `validation.traceability.unknownContractIdSeverity`: Spec が参照した契約 ID が存在しない場合の severity(default: `error`、`error` / `warning` のみ)
46
+
47
+ `npx qfai init` は `.qfai/contracts/` 配下に UI/API/DB のサンプルを生成します。
48
+
49
+ SC→Test の参照はテストコード内の `QFAI:SC-xxxx` アノテーションで宣言します。
50
+ SC→Test の対象ファイルは `validation.traceability.testFileGlobs` で指定します。
51
+ 除外は `validation.traceability.testFileExcludeGlobs` で指定できます。
35
52
  SC→Test 検証は `validation.traceability.scMustHaveTest` と
36
53
  `validation.traceability.scNoTestSeverity` で制御できます。
37
54
 
55
+ - `validation.traceability.testFileGlobs`: SC→Test 判定に使用するテストファイル glob(配列)
56
+ - `validation.traceability.testFileExcludeGlobs`: 追加の除外 glob(配列、任意)
38
57
  - `validation.traceability.scMustHaveTest`: SC→Test 検証の有効/無効を制御(`true` で有効、`false` で無効)
39
58
  - `validation.traceability.scNoTestSeverity`: SC 未参照時の重要度を指定(`error` / `warning`)
@@ -11,7 +11,8 @@ npx qfai report
11
11
 
12
12
  ## トレーサビリティ(SC→Test)
13
13
 
14
- - `tests/` 配下のテストコードで `SC-xxxx` を参照する(コメント可)
14
+ - `validation.traceability.testFileGlobs` に一致するテストコードで `QFAI:SC-xxxx` を参照する(コメント可)
15
+ - Spec→Contract は `spec.md` の `QFAI-CONTRACT-REF` 行で宣言する
15
16
 
16
17
  ## ディレクトリ概要
17
18
 
@@ -32,6 +33,7 @@ npx qfai report
32
33
  - `rules/pnpm.md`
33
34
  - `prompts/README.md`
34
35
  - `prompts/require-to-spec.md`
36
+ - `prompts/qfai-generate-test-globs.md`
35
37
  - `promptpack/constitution.md`
36
38
  - `out/README.md`
37
39
 
@@ -6,11 +6,18 @@
6
6
 
7
7
  - UI: `ui/ui-0001-<slug>.yaml` または `.yml`
8
8
  - API: `api/api-0001-<slug>.yaml` / `.yml` / `.json`(OpenAPI)
9
- - DB: `db/db-0001-<slug>.sql`(ID は `DATA-xxxx`)
9
+ - DB: `db/db-0001-<slug>.sql`(ID は `DB-xxxx`)
10
+
11
+ ## 契約ID宣言(必須)
12
+
13
+ - 1ファイル = 1ID
14
+ - ファイル内に `QFAI-CONTRACT-ID: <ID>` をコメント行で宣言する
15
+ - 例: `# QFAI-CONTRACT-ID: API-0001` / `// QFAI-CONTRACT-ID: UI-0001` / `-- QFAI-CONTRACT-ID: DB-0001`
10
16
 
11
17
  ## 最小例(UI)
12
18
 
13
19
  ```yaml
20
+ # QFAI-CONTRACT-ID: UI-0001
14
21
  id: UI-0001
15
22
  name: 受注登録画面
16
23
  refs:
@@ -20,6 +27,7 @@ refs:
20
27
  ## 最小例(API)
21
28
 
22
29
  ```yaml
30
+ # QFAI-CONTRACT-ID: API-0001
23
31
  openapi: 3.0.0
24
32
  info:
25
33
  title: Sample API
@@ -36,7 +44,7 @@ paths:
36
44
  ## 最小例(DB)
37
45
 
38
46
  ```sql
39
- -- DATA-0001
47
+ -- QFAI-CONTRACT-ID: DB-0001
40
48
  CREATE TABLE sample_table (
41
49
  id INTEGER PRIMARY KEY
42
50
  );
@@ -44,16 +52,17 @@ CREATE TABLE sample_table (
44
52
 
45
53
  ## CI でチェックされること(抜粋)
46
54
 
47
- - UI/API: パース失敗は error、ID 未定義は error
48
- - UI: `UI-xxxx` の ID が必要
49
- - API: OpenAPI 定義があること、`API-xxxx` の operationId が必要
55
+ - 契約宣言: `QFAI-CONTRACT-ID` の未記載/複数宣言/重複ID error
56
+ - 契約ID: 配置ディレクトリ(ui/api/db)と prefix(UI/API/DB)の不整合は error
57
+ - UI/API: パース失敗は error
58
+ - API: OpenAPI 定義があること(`openapi`)
50
59
  - DB: 危険 SQL(DROP/TRUNCATE 等)の警告
51
- - 共通: ID 形式(`PREFIX-0001`)、定義 ID の重複検知
60
+ - 共通: ID 形式(`PREFIX-0001`)、ID の重複検知
52
61
 
53
62
  ## 依存関係
54
63
 
55
- - Scenario → Contracts(UI/API/DATA のいずれかへ接続)
56
- - Spec → Contracts(参照は許容)
64
+ - Spec → Contracts(`QFAI-CONTRACT-REF` で宣言、`none` 可)
65
+ - Scenario → Contracts(UI/API/DB の参照は任意)
57
66
 
58
67
  ## 良い例 / 悪い例
59
68
 
@@ -1,6 +1,7 @@
1
+ # QFAI-CONTRACT-ID: API-0001
1
2
  # OpenAPI contract sample (API-0001)
3
+ # - 必須: QFAI-CONTRACT-ID (1ファイル1ID)
2
4
  # - 必須: openapi, info, paths
3
- # - 重要: operationId に API-0001 のような ID を含める(validate が参照整合に利用)
4
5
  openapi: 3.0.0
5
6
  info:
6
7
  title: QFAI Sample API
@@ -8,7 +9,7 @@ info:
8
9
  paths:
9
10
  /health:
10
11
  get:
11
- operationId: API-0001
12
+ operationId: healthCheck
12
13
  responses:
13
14
  "200":
14
15
  description: OK
@@ -1,4 +1,5 @@
1
- -- DATA-0001 (DB contract sample)
1
+ -- QFAI-CONTRACT-ID: DB-0001
2
+ -- DB-0001 (DB contract sample)
2
3
  -- 破壊的 SQL (削除/破棄系) は警告対象
3
4
  CREATE TABLE sample_table (
4
5
  id INTEGER PRIMARY KEY,
@@ -1,5 +1,7 @@
1
+ # QFAI-CONTRACT-ID: UI-0001
1
2
  # UI contract sample (UI-0001)
2
- # - 必須: id (例: UI-0001), name, refs
3
+ # - 必須: QFAI-CONTRACT-ID (1ファイル1ID)
4
+ # - 任意: id, name, refs
3
5
  id: UI-0001
4
6
  name: Order Registration
5
7
  refs:
@@ -1,4 +1,5 @@
1
1
  # Mode: Change
2
2
 
3
- - 仕様変更の根拠を delta.md に必ず記録する
4
- - 影響範囲を整理し、テストを増分で設計する
3
+ - 期待値/挙動/互換性が変わる場合は Change を選ぶ
4
+ - 仕様変更の根拠(Why)を delta.md に必ず記録する
5
+ - 影響範囲、移行・運用への影響、受入テスト更新方針を明記する
@@ -1,4 +1,6 @@
1
1
  # Mode: Compatibility
2
2
 
3
3
  - 既存仕様との整合を最優先にする
4
+ - 期待値/外部I/Fの変更は行わない(変更がある場合は Change へ)
4
5
  - 影響範囲を最小化し、回帰テストを重視する
6
+ - 分類と根拠(Why)、影響範囲、受入テスト更新方針を明記する
@@ -12,6 +12,7 @@
12
12
  - `makeOverview.md`: Spec 一覧(overview)生成
13
13
  - `makeBusinessFlow.md`: 業務フロー(BF)整理
14
14
  - `require-to-spec.md`: 既存要件から Spec Pack を起こす
15
+ - `qfai-generate-test-globs.md`: テストファイル glob の生成支援(`qfai.config.yaml` 更新)
15
16
 
16
17
  ## 使い方(例)
17
18
 
@@ -0,0 +1,29 @@
1
+ # QFAI: テストファイル glob 生成(プロジェクト分析→qfai.config.yaml 更新)
2
+
3
+ あなたはリポジトリを解析し、QFAI の SC→Test 判定に使用する「テストファイル glob」を作成します。
4
+
5
+ ## 目的
6
+
7
+ - SC→Test の根拠は **テストファイル内の `QFAI:SC-xxxx`** アノテーションです。
8
+ - その抽出対象(テストファイル集合)を、プロジェクト実態に合わせて **過不足なく**指定してください。
9
+
10
+ ## 手順
11
+
12
+ 1. どのテストフレームワーク/ランナーが使われているかを特定してください。
13
+ - 例: `package.json` の dependencies/devDependencies、設定ファイル(`vitest.config.*`, `jest.config.*`, `playwright.config.*` 等)、CI 設定など
14
+ 2. テストファイルが存在するディレクトリと命名規則を列挙してください。
15
+ - `tests/` 配下だけでなく、**`src/` 同居**(`*.test.*`)も考慮すること
16
+ - e2e / integration / unit が分かれている場合はそれも考慮すること
17
+ 3. 「テストファイル glob(含める)」を 3-10 個程度で提案してください。
18
+ - 過剰に広い `**/*` は禁止(性能・誤検知の観点)
19
+ 4. 「除外 glob」を提案してください(既定除外に加えて必要なら)。
20
+ 5. `qfai.config.yaml` を更新してください。
21
+ - `validation.traceability.testFileGlobs` に glob 配列を設定
22
+ - 必要なら `validation.traceability.testFileExcludeGlobs` も設定
23
+ 6. 更新後、実在するテストファイルを 5-15 件サンプリングし、各ファイルが提案 glob にマッチすることを示してください。
24
+ 7. 最後に、提案 glob を 1 行ずつコメント付きでまとめてください(採用理由を短く)。
25
+
26
+ ## 制約
27
+
28
+ - `.qfai/` 配下、`node_modules/`、ビルド成果物(`dist/`, `build/` 等)は対象外
29
+ - 変更は **glob 設定に限定**(テストやソースの内容改変はしない)
@@ -19,12 +19,14 @@
19
19
  ## Rules
20
20
 
21
21
  - **推測しない**。要件に書かれていないことは `TBD` と明記する。
22
- - ID は `PREFIX-0001` 形式(SPEC/BR/SC/UI/API/DATA)。
22
+ - ID は `PREFIX-0001` 形式(SPEC/BR/SC/UI/API/DB)。
23
23
  - `spec.md` の必須セクションは `qfai.config.yaml` の設定に従う。
24
24
  - BR は `## 業務ルール` にのみ定義し、`- [BR-0001][P1] ...` 形式で書く。
25
+ - `spec.md` に `QFAI-CONTRACT-REF:` を必ず記載する(不要なら `none`)。
25
26
  - `scenario.md` は Gherkin で書き、Feature に `@SPEC-xxxx` を付与する。
26
27
  - 各 Scenario は `@SC-xxxx` を **ちょうど1つ**、`@BR-xxxx` を **1つ以上**持つこと。
27
- - 契約 ID(UI/API/DATA)が必要なら、タグまたは本文に明示する。
28
+ - 契約ファイルには `QFAI-CONTRACT-ID: <ID>` を宣言する。
29
+ - 契約 ID(UI/API/DB)を Scenario で参照する場合はタグまたは本文に明示する。
28
30
  - `delta.md` の「変更区分」は **Compatibility / Change/Improvement のいずれか1つにチェック**する。
29
31
  - 判断できない場合は `Compatibility` を選び、`TBD` を理由欄に記載する。
30
32
 
@@ -15,6 +15,8 @@
15
15
  ```md
16
16
  # SPEC-0001: 注文登録の最小要件
17
17
 
18
+ QFAI-CONTRACT-REF: UI-0001, API-0001, DB-0001
19
+
18
20
  ## 背景
19
21
 
20
22
  - 例: 受注の登録ルールを明文化し、手戻りを減らすため
@@ -30,6 +32,11 @@
30
32
  - Priority は **P0/P1/P2/P3** のいずれかを必ず付与
31
33
  - BR 定義は **`## 業務ルール` セクション内のみ**(他セクションは参照扱い)
32
34
 
35
+ ### Contract 参照の書き方
36
+
37
+ - `QFAI-CONTRACT-REF:` 行で契約IDを宣言する(複数行可)
38
+ - 参照不要な場合は `QFAI-CONTRACT-REF: none`
39
+
33
40
  ## Delta(delta.md)
34
41
 
35
42
  - 互換維持 / 仕様変更の **どちらか1つ**に必ずチェックする
@@ -44,8 +51,8 @@
44
51
 
45
52
  ## CI でチェックされること(抜粋)
46
53
 
47
- - Spec: 必須セクション、SPEC/BR ID、BR Priority、ID 形式、Contract 参照の実在性
54
+ - Spec: 必須セクション、SPEC/BR ID、BR Priority、ID 形式、Contract 参照の実在性、Contract 参照の必須宣言
48
55
  - Delta: 変更区分(互換/変更)のチェック状態
49
56
  - Scenario: Feature/Scenario の存在、タグ要件、Given/When/Then
50
- - Traceability: BR→SC、SC→契約(UI/API/DATA)、SC→Test の接続、BR の所属 SPEC 整合
57
+ - Traceability: BR→SC、Spec→Contract、SC→Test の接続、BR の所属 SPEC 整合
51
58
  - IDs: 定義 ID の重複検知(Spec/Scenario/Contracts)
@@ -1,5 +1,7 @@
1
1
  # SPEC-0001: 注文登録の最小仕様(サンプル)
2
2
 
3
+ QFAI-CONTRACT-REF: API-0001, UI-0001, DB-0001
4
+
3
5
  > このテンプレは **最小例** です。実際の仕様に合わせて書き換えてください。
4
6
 
5
7
  ## 背景
@@ -19,8 +19,13 @@ validation:
19
19
  - 業務ルール
20
20
  traceability:
21
21
  brMustHaveSc: true
22
- scMustTouchContracts: true
23
22
  scMustHaveTest: true
23
+ testFileGlobs:
24
+ - tests/**/*.test.ts
25
+ - tests/**/*.spec.ts
26
+ - src/**/*.test.ts
27
+ - src/**/*.spec.ts
28
+ testFileExcludeGlobs: []
24
29
  scNoTestSeverity: error
25
30
  allowOrphanContracts: false
26
31
  unknownContractIdSeverity: error
@@ -1,2 +1,2 @@
1
- // Traceability sample: reference SC IDs in tests (comments are enough).
2
- // SC-0001
1
+ // Traceability sample: reference SC IDs via annotations (comments are enough).
2
+ // QFAI:SC-0001