qfai 0.8.1 → 0.9.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 CHANGED
@@ -12,6 +12,7 @@
12
12
  - [Quick Start](#quick-start最短成功)
13
13
  - [機能](#できること)
14
14
  - [CLI リファレンス](#使い方cli)
15
+ - [analyze(意味矛盾のレビュー補助)](#analyze意味矛盾のレビュー補助)
15
16
  - [設定](#設定)
16
17
  - [契約](#契約contracts)
17
18
  - [Monorepo 対応](#monorepo--サブディレクトリ)
@@ -48,7 +49,7 @@ npx qfai report
48
49
 
49
50
  ## できること
50
51
 
51
- - `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/**`、`.qfai/prompts.local/README.md`、`.qfai/promptpack/` を含む)
52
+ - `npx qfai init` によるテンプレート生成(specs/contracts に加え、`.qfai/require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/**`、`.qfai/prompts.local/README.md`、`.qfai/prompts/analyze/**`、`.qfai/samples/**`、`.qfai/promptpack/` を含む)
52
53
  - `npx qfai validate` による `.qfai/` 内ドキュメントの整合性・トレーサビリティ検査
53
54
  - `npx qfai validate` による SC→Test 参照の検証(`validation.traceability.testFileGlobs` に一致するテストファイルから `QFAI:SC-xxxx` を抽出)
54
55
  - `npx qfai doctor` による設定/探索/パス/glob/validate.json の事前診断
@@ -107,7 +108,33 @@ doctor の JSON も非契約(内部形式。将来予告なく変更あり)
107
108
  }
108
109
  ```
109
110
 
110
- `init --yes` は予約フラグです(現行の init は非対話のため挙動差はありません)。既存ファイルがある場合は `--force` が必要です。
111
+ `init --yes` は予約フラグです(現行の init は非対話のため挙動差はありません)。
112
+
113
+ - `--force` は `.qfai/prompts/**` のみ上書きします(それ以外は既存があればスキップします)
114
+ - `specs/` `contracts/` は初回にサンプルが生成されますが、再実行(force の有無に関わらず)で上書きしません
115
+ - それ以外を再生成したい場合は、対象を手動で削除してから `qfai init` を実行してください(運用中成果物の破壊を避けるため)
116
+
117
+ ## analyze(意味矛盾のレビュー補助)
118
+
119
+ `validate` は deterministic な構造矛盾(参照/フォーマット/トレーサビリティ)を検査し、CI Hard Gate にできます。一方で、**意味矛盾(解釈/前提/用語/例外/受入条件の齟齬)**は deterministic に検出できないため、v0.9 では **手動プロンプト**として導線を提供します。
120
+
121
+ 重要:
122
+
123
+ - analyze は **Hard Gate ではありません**(CI を落とさない想定)
124
+ - 出力は **候補**です。根拠(引用)を確認し、最終判断はレビューで行ってください
125
+
126
+ ### 使い方(最短)
127
+
128
+ 1. `.qfai/prompts/analyze/**` から目的に合うプロンプトを選ぶ
129
+ 2. 推奨入力(Spec/Scenario/validate結果/差分)を揃えて、AI に貼り付ける
130
+ 3. 結果をレビューし、必要な修正や議論に落とす
131
+
132
+ 成果物を残す場合は、`npx qfai init` が同梱する `.qfai/samples/analyze/analysis.md`(テンプレ)を使う運用を推奨します。
133
+
134
+ ### カスタマイズ(Overlay)
135
+
136
+ analyze も `.qfai/prompts.local/**` の overlay 運用に従います。
137
+ 同じ相対パスのファイルがある場合は `.qfai/prompts.local` を優先して参照してください。
111
138
 
112
139
  ## 設定
113
140
 
@@ -26,6 +26,7 @@ npx qfai report
26
26
  - `require/` : 既存要件の集約(validate 対象外)
27
27
  - `rules/` : 規約・運用ルール
28
28
  - `prompts/` : QFAI 標準のプロンプト資産(自動読取はしない。更新や再 init で上書きされ得る)
29
+ - `samples/` : analyze 等の手動運用で使う成果物テンプレ(create-only)
29
30
  - `prompts.local/` : 利用者カスタムのプロンプト資産(存在する場合は overlay でこちらを優先して読む運用)
30
31
  - `promptpack/` : PromptPack(SSOT、運用ルール/観点の正本)
31
32
  - `out/` : `validate` / `report` の出力先(gitignore 推奨)
@@ -38,12 +39,17 @@ npx qfai report
38
39
  - `rules/conventions.md`
39
40
  - `rules/pnpm.md`
40
41
  - `prompts/README.md`
42
+ - `prompts/analyze/README.md`
41
43
  - `prompts.local/README.md`
42
44
  - `prompts/require-to-spec.md`
43
45
  - `prompts/qfai-generate-test-globs.md`
44
46
  - `prompts/qfai-maintain-traceability.md`
45
47
  - `prompts/qfai-maintain-contracts.md`
46
48
  - `prompts/qfai-classify-change.md`
49
+ - `prompts/analyze/spec_scenario_consistency.md`
50
+ - `prompts/analyze/spec_contract_consistency.md`
51
+ - `prompts/analyze/scenario_test_consistency.md`
52
+ - `samples/analyze/analysis.md`
47
53
  - `promptpack/constitution.md`
48
54
  - `out/README.md`
49
55
 
@@ -63,7 +69,8 @@ v0.7 以降、プロンプト資産のカスタマイズは `.qfai/prompts.local
63
69
  - 利用者が `.qfai/prompts/**` を直接編集することは非推奨・非サポートです
64
70
  - 変更したい場合は同一相対パスで `.qfai/prompts.local/**` に置いて上書きしてください
65
71
  - `qfai init` は `.qfai/prompts.local/**` を **保護**します(`--force` でも上書きしません)
66
- - 現時点の保護対象は `prompts.local` のみです(それ以外は上書きされ得ます)
72
+ - `qfai init``root/` と `.qfai/` を create-only(既存があればスキップ)で運用します
73
+ - `--force` は `.qfai/prompts/**` のみ上書きします(`specs/` `contracts/` を含め、その他は上書きしません)
67
74
 
68
75
  例:
69
76
 
@@ -9,7 +9,8 @@
9
9
 
10
10
  - Spec から overview / Business Flow を生成するための素材
11
11
  - トレーサビリティ/契約/変更区分の運用支援(CIで止めない領域)
12
- - 将来(v0.9)の adapter/emit 実装に備えた配布物
12
+ - 意味矛盾(解釈/前提/用語/受入条件の齟齬)のレビュー補助(analyze)
13
+ - 将来の CLI 連携に備えた配布物(現時点では手動利用のみ)
13
14
 
14
15
  ## Overlay(prompts.local)
15
16
 
@@ -27,6 +28,10 @@
27
28
  - `qfai-maintain-traceability.md`: 参照切れの修復(Spec/Scenario/Test)
28
29
  - `qfai-maintain-contracts.md`: 契約 ID と参照の整合
29
30
  - `qfai-classify-change.md`: Compatibility / Change 分類支援
31
+ - `analyze/README.md`: analyze の目的/入力/出力フォーマット
32
+ - `analyze/spec_scenario_consistency.md`: Spec ↔ Scenario の意味整合
33
+ - `analyze/spec_contract_consistency.md`: Spec ↔ Contract の意味整合
34
+ - `analyze/scenario_test_consistency.md`: Scenario ↔ Test(SC参照)の表現妥当性
30
35
 
31
36
  ## 使い分け表
32
37
 
@@ -0,0 +1,38 @@
1
+ # analyze(手動利用)
2
+
3
+ このディレクトリは QFAI の `validate` が扱わない **意味矛盾(レベル1/2)** を、レビューのために洗い出すための **手動プロンプト集**です。
4
+
5
+ 重要:
6
+
7
+ - analyze は **Hard Gate ではありません**(CI を落とさない想定)
8
+ - 出力は **候補**です。根拠(引用)を必ず確認し、最終判断はレビューで行ってください
9
+ - `validate` が扱う **構造矛盾(参照/フォーマット/トレーサビリティ)** は対象外です
10
+
11
+ ## 推奨入力(最小セット)
12
+
13
+ - 対象 Spec Pack:
14
+ - `.qfai/specs/<spec-id>/spec.md`
15
+ - `.qfai/specs/<spec-id>/delta.md`
16
+ - `.qfai/specs/<spec-id>/scenario.md`
17
+ - `validate` の結果:
18
+ - `.qfai/out/report.md`(または `.qfai/out/validate.json` の要約)
19
+ - 変更差分:
20
+ - PR diff(または変更ファイル一覧)
21
+
22
+ 入力が不足すると見落としが増え、入力が多すぎると回答が拡散しやすくなります。まずは上記のセットに揃える運用を推奨します。
23
+
24
+ ## 推奨出力フォーマット
25
+
26
+ 各指摘を「レビューで決めるべき論点」として、次の項目を固定して出してください。
27
+
28
+ - 種別: `Contradiction` / `Ambiguity` / `Missing Case` / `Risk` / `Suggestion`
29
+ - 影響範囲: `Spec` / `Scenario` / `Contract` / `Test` / `Docs`
30
+ - 根拠: 入力の該当箇所を短く引用
31
+ - 判断理由: なぜ矛盾/曖昧に見えるか
32
+ - 推奨アクション: 次に何を直す/議論するか(CIを止める結論は出さない)
33
+
34
+ ## プロンプト一覧
35
+
36
+ - `spec_scenario_consistency.md`: Spec ↔ Scenario の意味整合
37
+ - `spec_contract_consistency.md`: Spec ↔ Contract の意味整合
38
+ - `scenario_test_consistency.md`: Scenario ↔ Test(SC参照)の表現妥当性
@@ -0,0 +1,35 @@
1
+ # analyze: Scenario ↔ Test consistency
2
+
3
+ あなたは QFAI 運用におけるレビュー補助者です。
4
+ 目的は Scenario の意図と、テスト(主に SC 参照)で表現している内容の **妥当性**(抜け/重複/過剰な固定)を候補として列挙することです。
5
+
6
+ 重要:
7
+
8
+ - これは Hard Gate ではありません(CI を落とす結論は出さない)。
9
+ - 出力は候補です。根拠(引用)を必ず添えてください。
10
+ - `validate` が扱う構造矛盾(SC 参照の欠落/未知IDなど)は対象外です。
11
+
12
+ ## 入力
13
+
14
+ - Scenario: <貼り付け>
15
+ - テストコード抜粋(該当ファイル): <貼り付け>
16
+ - validate/report 要約: <貼り付け>
17
+ - 変更差分(任意): <貼り付け>
18
+
19
+ ## 出力(厳守)
20
+
21
+ 以下の形式で、見つかった分だけ列挙してください。最大 12 件まで。
22
+
23
+ - 種別: Contradiction | Ambiguity | Missing Case | Risk | Suggestion
24
+ - 影響範囲: Spec | Scenario | Contract | Test | Docs
25
+ - 根拠: "..."(短い引用を 1〜2 個)
26
+ - 判断理由: なぜ抜け/重複/過剰固定に見えるか
27
+ - 推奨アクション: 次に何を直す/議論するか
28
+
29
+ ## 観点
30
+
31
+ - Scenario の受入条件に対してテストが不足している
32
+ - テストが Scenario にない要件を固定してしまっている(過剰な固定)
33
+ - 同じ意図のテストが重複している
34
+ - 境界値/例外系/権限/並行性など、事故りやすい論点が抜けている
35
+ - SC 参照はあるが、シナリオの主張を検証していない
@@ -0,0 +1,36 @@
1
+ # analyze: Spec ↔ Contract consistency
2
+
3
+ あなたは QFAI 運用におけるレビュー補助者です。
4
+ 目的は Spec と Contract の **意味整合**(期待する入出力/副作用/用語/エラーの扱い)を確認し、ズレを候補として列挙することです。
5
+
6
+ 重要:
7
+
8
+ - これは Hard Gate ではありません(CI を落とす結論は出さない)。
9
+ - 出力は候補です。根拠(引用)を必ず添えてください。
10
+ - `validate` が扱う構造矛盾(ID/参照/フォーマット)は対象外です。
11
+
12
+ ## 入力
13
+
14
+ - Spec: <貼り付け>
15
+ - Contract: <貼り付け>
16
+ - validate/report 要約: <貼り付け>
17
+ - 変更差分(任意): <貼り付け>
18
+
19
+ ## 出力(厳守)
20
+
21
+ 以下の形式で、見つかった分だけ列挙してください。最大 12 件まで。
22
+
23
+ - 種別: Contradiction | Ambiguity | Missing Case | Risk | Suggestion
24
+ - 影響範囲: Spec | Scenario | Contract | Test | Docs
25
+ - 根拠: "..."(短い引用を 1〜2 個)
26
+ - 判断理由: なぜ矛盾/曖昧に見えるか
27
+ - 推奨アクション: 次に何を直す/議論するか
28
+
29
+ ## 観点
30
+
31
+ - 用語/フィールド名/概念の不一致
32
+ - Spec の期待(入力/出力/状態遷移)と Contract の定義の不一致
33
+ - エラー/例外の扱い(HTTP status / error code / validation error の条件)
34
+ - 非機能(性能/レート制限/タイムアウト/整合性)への言及のズレ
35
+ - Contract が Spec の範囲を超えて規定している(過剰な固定)
36
+ - Spec が Contract の重要条件を説明していない(根拠不足)
@@ -0,0 +1,35 @@
1
+ # analyze: Spec ↔ Scenario consistency
2
+
3
+ あなたは QFAI 運用におけるレビュー補助者です。
4
+ 目的は `validate` が扱わない **意味矛盾**(用語/前提/例外/受入条件の齟齬)を、レビューで判断できる形で列挙することです。
5
+
6
+ 重要:
7
+
8
+ - これは Hard Gate ではありません。CI を落とす結論は出さないでください。
9
+ - 出力は候補です。根拠(引用)を必ず添えてください。
10
+ - `validate` が扱う構造矛盾(参照/フォーマット/ID)は対象外です。
11
+
12
+ ## 入力
13
+
14
+ - Spec: <貼り付け>
15
+ - Scenario: <貼り付け>
16
+ - validate/report 要約: <貼り付け>
17
+ - 変更差分(任意): <貼り付け>
18
+
19
+ ## 出力(厳守)
20
+
21
+ 以下の形式で、見つかった分だけ列挙してください。最大 12 件まで。重大度の推定は不要です。
22
+
23
+ - 種別: Contradiction | Ambiguity | Missing Case | Risk | Suggestion
24
+ - 影響範囲: Spec | Scenario | Contract | Test | Docs
25
+ - 根拠: "..."(短い引用を 1〜2 個)
26
+ - 判断理由: なぜ矛盾/曖昧に見えるか
27
+ - 推奨アクション: 次に何を直す/議論するか
28
+
29
+ ## 観点
30
+
31
+ - 用語の不一致(同じ概念が別名、別概念が同名)
32
+ - 前提条件/制約の不一致(Spec にあるが Scenario にない、または逆)
33
+ - 例外系/エラー系の扱いの不一致
34
+ - Acceptance Criteria の抜け/過剰/言い回しのズレ
35
+ - Scenario の手順が Spec の要求を満たしていない/逆に余計な要求を足している
@@ -27,4 +27,5 @@ QFAI v0.7 以降は、プロンプト資産のカスタマイズ手段を **over
27
27
  ## init 再実行時の保護(契約)
28
28
 
29
29
  - `qfai init` は `.qfai/prompts.local/**` を **保護**します(`--force` を付けても上書きしません)。
30
- - 現時点でこの保護対象は `prompts.local` のみです。
30
+ - `--force` は `.qfai/prompts/**` のみ上書きします。
31
+ - `specs/` `contracts/` を含め、その他の領域は既存があればスキップします(上書きしません)。
@@ -0,0 +1,38 @@
1
+ # analyze 実施ログ(テンプレート)
2
+
3
+ > 目的: analyze は `validate` が扱わない「意味矛盾」の候補を抽出するための **レビュー補助**です。
4
+ > 結果は正解判定ではありません。根拠(引用)を確認し、レビューで判断してください。
5
+
6
+ ## メタ
7
+
8
+ - 実施日: YYYY-MM-DD
9
+ - 対象: <PR番号 / ブランチ / 変更スコープ>
10
+ - 利用モデル/環境: <任意>
11
+
12
+ ## 入力(貼り付けたもの)
13
+
14
+ - Spec: <spec.md / delta.md の該当範囲>
15
+ - Scenario: <scenario.md の該当範囲>
16
+ - Contract(任意): <該当契約>
17
+ - validate/report 要約: <report.md または validate.json の要約>
18
+ - 差分: <PR diff / 変更ファイル一覧>
19
+
20
+ ## 実行したプロンプト
21
+
22
+ - `.qfai/prompts/analyze/spec_scenario_consistency.md`
23
+ - `.qfai/prompts/analyze/spec_contract_consistency.md`
24
+ - `.qfai/prompts/analyze/scenario_test_consistency.md`
25
+
26
+ ## 結果(候補)
27
+
28
+ - <貼り付け>
29
+
30
+ ## レビュー判断
31
+
32
+ - 採用(修正する): <項目>
33
+ - 却下(問題なし/誤検知): <項目>
34
+ - 保留(追加調査/議論): <項目>
35
+
36
+ ## 次アクション
37
+
38
+ - <誰が/何を/いつまでに>
@@ -1015,8 +1015,8 @@ var import_promises7 = require("fs/promises");
1015
1015
  var import_node_path8 = __toESM(require("path"), 1);
1016
1016
  var import_node_url2 = require("url");
1017
1017
  async function resolveToolVersion() {
1018
- if ("0.8.1".length > 0) {
1019
- return "0.8.1";
1018
+ if ("0.9.0".length > 0) {
1019
+ return "0.9.0";
1020
1020
  }
1021
1021
  try {
1022
1022
  const packagePath = resolvePackageJsonPath();
@@ -1541,6 +1541,11 @@ async function runInit(options) {
1541
1541
  const qfaiAssets = import_node_path12.default.join(assetsRoot, ".qfai");
1542
1542
  const destRoot = import_node_path12.default.resolve(options.dir);
1543
1543
  const destQfai = import_node_path12.default.join(destRoot, ".qfai");
1544
+ if (options.force) {
1545
+ info(
1546
+ "NOTE: --force \u306F .qfai/prompts/** \u306E\u307F\u4E0A\u66F8\u304D\u3057\u307E\u3059\uFF08prompts.local \u306F\u4FDD\u8B77\u3055\u308C\u3001specs/contracts \u7B49\u306F\u4E0A\u66F8\u304D\u3057\u307E\u305B\u3093\uFF09\u3002"
1547
+ );
1548
+ }
1544
1549
  const rootResult = await copyTemplateTree(rootAssets, destRoot, {
1545
1550
  force: false,
1546
1551
  dryRun: options.dryRun,
@@ -4432,7 +4437,7 @@ Commands:
4432
4437
  Options:
4433
4438
  --root <path> \u5BFE\u8C61\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA
4434
4439
  --dir <path> init \u306E\u51FA\u529B\u5148
4435
- --force \u65E2\u5B58\u30D5\u30A1\u30A4\u30EB\u3092\u4E0A\u66F8\u304D
4440
+ --force init: .qfai/prompts \u306E\u307F\u4E0A\u66F8\u304D\uFF08\u305D\u308C\u4EE5\u5916\u306F\u65E2\u5B58\u304C\u3042\u308C\u3070\u30B9\u30AD\u30C3\u30D7\uFF09
4436
4441
  --yes init: \u4E88\u7D04\u30D5\u30E9\u30B0\uFF08\u73FE\u72B6\u306F\u975E\u5BFE\u8A71\u306E\u305F\u3081\u6319\u52D5\u5DEE\u306A\u3057\u3002\u5C06\u6765\u306E\u5BFE\u8A71\u5C0E\u5165\u6642\u306B\u81EA\u52D5Yes\uFF09
4437
4442
  --dry-run \u5909\u66F4\u3092\u884C\u308F\u305A\u8868\u793A\u306E\u307F
4438
4443
  --format <text|github> validate \u306E\u51FA\u529B\u5F62\u5F0F