qfai 0.2.5 → 0.2.6

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 (127) hide show
  1. package/README.md +1 -1
  2. package/assets/init/.qfai/README.md +42 -0
  3. package/assets/init/.qfai/contracts/README.md +59 -0
  4. package/assets/init/{qfai → .qfai}/contracts/api/api-0001-sample.yaml +3 -0
  5. package/assets/init/{qfai → .qfai}/contracts/db/db-0001-sample.sql +3 -2
  6. package/assets/init/.qfai/contracts/ui/ui-0001-sample.yaml +6 -0
  7. package/assets/init/.qfai/out/README.md +17 -0
  8. package/assets/init/.qfai/prompts/README.md +32 -0
  9. package/assets/init/{qfai → .qfai}/prompts/makeBusinessFlow.md +1 -1
  10. package/assets/init/{qfai → .qfai}/prompts/makeOverview.md +1 -1
  11. package/assets/init/.qfai/spec/README.md +77 -0
  12. package/assets/init/.qfai/spec/decisions/ADR-0001.md +9 -0
  13. package/assets/init/.qfai/spec/decisions/README.md +36 -0
  14. package/assets/init/.qfai/spec/scenarios/scenarios.feature +6 -0
  15. package/assets/init/.qfai/spec/spec-0001-sample.md +36 -0
  16. package/assets/init/root/qfai.config.yaml +8 -8
  17. package/dist/cli/index.cjs +16 -16
  18. package/dist/cli/index.cjs.map +1 -1
  19. package/dist/cli/index.d.ts +0 -2
  20. package/dist/cli/index.mjs +16 -16
  21. package/dist/cli/index.mjs.map +1 -1
  22. package/dist/index.cjs +14 -14
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +132 -2
  25. package/dist/index.mjs +14 -14
  26. package/dist/index.mjs.map +1 -1
  27. package/package.json +1 -1
  28. package/assets/init/qfai/README.md +0 -6
  29. package/assets/init/qfai/contracts/ui/ui-0001-sample.yaml +0 -4
  30. package/assets/init/qfai/spec/decisions/ADR-0001.md +0 -7
  31. package/assets/init/qfai/spec/scenarios.feature +0 -6
  32. package/assets/init/qfai/spec/spec-0001-sample.md +0 -29
  33. package/dist/cli/commands/init.d.ts +0 -8
  34. package/dist/cli/commands/init.d.ts.map +0 -1
  35. package/dist/cli/commands/init.js +0 -30
  36. package/dist/cli/commands/init.js.map +0 -1
  37. package/dist/cli/commands/report.d.ts +0 -8
  38. package/dist/cli/commands/report.d.ts.map +0 -1
  39. package/dist/cli/commands/report.js +0 -83
  40. package/dist/cli/commands/report.js.map +0 -1
  41. package/dist/cli/commands/validate.d.ts +0 -10
  42. package/dist/cli/commands/validate.d.ts.map +0 -1
  43. package/dist/cli/commands/validate.js +0 -66
  44. package/dist/cli/commands/validate.js.map +0 -1
  45. package/dist/cli/index.d.ts.map +0 -1
  46. package/dist/cli/index.js +0 -7
  47. package/dist/cli/index.js.map +0 -1
  48. package/dist/cli/lib/args.d.ts +0 -19
  49. package/dist/cli/lib/args.d.ts.map +0 -1
  50. package/dist/cli/lib/args.js +0 -107
  51. package/dist/cli/lib/args.js.map +0 -1
  52. package/dist/cli/lib/assets.d.ts +0 -2
  53. package/dist/cli/lib/assets.d.ts.map +0 -1
  54. package/dist/cli/lib/assets.js +0 -8
  55. package/dist/cli/lib/assets.js.map +0 -1
  56. package/dist/cli/lib/failOn.d.ts +0 -5
  57. package/dist/cli/lib/failOn.d.ts.map +0 -1
  58. package/dist/cli/lib/failOn.js +0 -10
  59. package/dist/cli/lib/failOn.js.map +0 -1
  60. package/dist/cli/lib/fs.d.ts +0 -11
  61. package/dist/cli/lib/fs.d.ts.map +0 -1
  62. package/dist/cli/lib/fs.js +0 -91
  63. package/dist/cli/lib/fs.js.map +0 -1
  64. package/dist/cli/lib/logger.d.ts +0 -4
  65. package/dist/cli/lib/logger.d.ts.map +0 -1
  66. package/dist/cli/lib/logger.js +0 -10
  67. package/dist/cli/lib/logger.js.map +0 -1
  68. package/dist/cli/main.d.ts +0 -2
  69. package/dist/cli/main.d.ts.map +0 -1
  70. package/dist/cli/main.js +0 -73
  71. package/dist/cli/main.js.map +0 -1
  72. package/dist/core/config.d.ts +0 -46
  73. package/dist/core/config.d.ts.map +0 -1
  74. package/dist/core/config.js +0 -224
  75. package/dist/core/config.js.map +0 -1
  76. package/dist/core/discovery.d.ts +0 -11
  77. package/dist/core/discovery.d.ts.map +0 -1
  78. package/dist/core/discovery.js +0 -31
  79. package/dist/core/discovery.js.map +0 -1
  80. package/dist/core/fs.d.ts +0 -6
  81. package/dist/core/fs.d.ts.map +0 -1
  82. package/dist/core/fs.js +0 -55
  83. package/dist/core/fs.js.map +0 -1
  84. package/dist/core/ids.d.ts +0 -5
  85. package/dist/core/ids.d.ts.map +0 -1
  86. package/dist/core/ids.js +0 -49
  87. package/dist/core/ids.js.map +0 -1
  88. package/dist/core/index.d.ts +0 -11
  89. package/dist/core/index.d.ts.map +0 -1
  90. package/dist/core/index.js +0 -11
  91. package/dist/core/index.js.map +0 -1
  92. package/dist/core/report.d.ts +0 -41
  93. package/dist/core/report.d.ts.map +0 -1
  94. package/dist/core/report.js +0 -238
  95. package/dist/core/report.js.map +0 -1
  96. package/dist/core/types.d.ts +0 -27
  97. package/dist/core/types.d.ts.map +0 -1
  98. package/dist/core/types.js +0 -2
  99. package/dist/core/types.js.map +0 -1
  100. package/dist/core/validate.d.ts +0 -4
  101. package/dist/core/validate.d.ts.map +0 -1
  102. package/dist/core/validate.js +0 -32
  103. package/dist/core/validate.js.map +0 -1
  104. package/dist/core/validators/contracts.d.ts +0 -5
  105. package/dist/core/validators/contracts.d.ts.map +0 -1
  106. package/dist/core/validators/contracts.js +0 -157
  107. package/dist/core/validators/contracts.js.map +0 -1
  108. package/dist/core/validators/scenario.d.ts +0 -5
  109. package/dist/core/validators/scenario.d.ts.map +0 -1
  110. package/dist/core/validators/scenario.js +0 -82
  111. package/dist/core/validators/scenario.js.map +0 -1
  112. package/dist/core/validators/spec.d.ts +0 -5
  113. package/dist/core/validators/spec.d.ts.map +0 -1
  114. package/dist/core/validators/spec.js +0 -69
  115. package/dist/core/validators/spec.js.map +0 -1
  116. package/dist/core/validators/traceability.d.ts +0 -4
  117. package/dist/core/validators/traceability.d.ts.map +0 -1
  118. package/dist/core/validators/traceability.js +0 -148
  119. package/dist/core/validators/traceability.js.map +0 -1
  120. package/dist/core/version.d.ts +0 -2
  121. package/dist/core/version.d.ts.map +0 -1
  122. package/dist/core/version.js +0 -25
  123. package/dist/core/version.js.map +0 -1
  124. package/dist/index.d.ts.map +0 -1
  125. package/dist/index.js +0 -2
  126. package/dist/index.js.map +0 -1
  127. package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # QFAI Toolkit (v0.2.5)
1
+ # QFAI Toolkit (v0.2.6)
2
2
 
3
3
  Single-package distribution for QFAI.
4
4
 
@@ -0,0 +1,42 @@
1
+ # QFAI Project Kit (.qfai)
2
+
3
+ このディレクトリは QFAI の成果物を集約する専用領域です。`.qfai` 配下だけを見れば「何を書くか」「どこから始めるか」が分かる構成にしています。
4
+
5
+ ## 最短成功(init → validate → report)
6
+
7
+ ```bash
8
+ npx qfai validate --fail-on error --format github --json-path .qfai/out/validate.json
9
+ npx qfai report --json-path .qfai/out/validate.json --out .qfai/out/report.md
10
+ ```
11
+
12
+ ## ディレクトリ概要
13
+
14
+ - `spec/` : 仕様・シナリオ・ADR(意思決定)を置く場所
15
+ - `contracts/` : UI / API / DB 契約を置く場所
16
+ - `prompts/` : 生成プロンプト資産(自動読取はしない)
17
+ - `out/` : `validate` / `report` の出力先(gitignore 推奨)
18
+
19
+ 詳細は各 README を参照してください。
20
+
21
+ - `spec/README.md`
22
+ - `spec/decisions/README.md`
23
+ - `contracts/README.md`
24
+ - `prompts/README.md`
25
+ - `out/README.md`
26
+
27
+ ## 設定と CI
28
+
29
+ - 設定ファイル: `qfai.config.yaml`(リポジトリ直下)
30
+ - CI テンプレ: `.github/workflows/qfai.yml`
31
+
32
+ ## Prompts の使い方(重要)
33
+
34
+ `prompts/` は **人間が手動で使う資産**です。v0.2.6 では自動読取を行いません。
35
+
36
+ 例:
37
+
38
+ - Copilot: `.github/copilot-instructions.md` に要旨を転記
39
+ - Claude: `CLAUDE.md` に要旨を転記
40
+ - Codex: `AGENTS.md` に要旨を転記
41
+
42
+ 詳細は `prompts/README.md` を参照してください。
@@ -0,0 +1,59 @@
1
+ # Contracts (UI / API / DB)
2
+
3
+ 契約は「システム外部との約束」を明文化する場所です。Scenario から参照される前提で作成します。
4
+
5
+ ## 置くべきファイル
6
+
7
+ - UI: `ui/ui-0001-<slug>.yaml` または `.yml`
8
+ - API: `api/api-0001-<slug>.yaml` / `.yml` / `.json`(OpenAPI)
9
+ - DB: `db/db-0001-<slug>.sql`(ID は `DATA-xxxx`)
10
+
11
+ ## 最小例(UI)
12
+
13
+ ```yaml
14
+ id: UI-0001
15
+ name: 受注登録画面
16
+ refs:
17
+ - BR-0001
18
+ ```
19
+
20
+ ## 最小例(API)
21
+
22
+ ```yaml
23
+ openapi: 3.0.0
24
+ info:
25
+ title: Sample API
26
+ version: 0.1.0
27
+ paths:
28
+ /health:
29
+ get:
30
+ operationId: API-0001
31
+ responses:
32
+ "200":
33
+ description: OK
34
+ ```
35
+
36
+ ## 最小例(DB)
37
+
38
+ ```sql
39
+ -- DATA-0001
40
+ CREATE TABLE sample_table (
41
+ id INTEGER PRIMARY KEY
42
+ );
43
+ ```
44
+
45
+ ## CI でチェックされること(抜粋)
46
+
47
+ - UI: YAML 解析、`id` が `UI-` で始まる
48
+ - API: OpenAPI 定義があること
49
+ - DB: 危険 SQL(DROP/TRUNCATE 等)の警告
50
+ - 共通: ID 形式の検証
51
+
52
+ ## 依存関係
53
+
54
+ - Scenario → Contracts(UI/API/DATA のいずれかへ接続)
55
+
56
+ ## 良い例 / 悪い例
57
+
58
+ - 良い例: `@SC-xxxx` から `UI-xxxx` が参照されている
59
+ - 悪い例: 契約が Scenario から一切参照されない
@@ -1,3 +1,6 @@
1
+ # OpenAPI contract sample (API-0001)
2
+ # - 必須: openapi, info, paths
3
+ # - 参照: BR/SC の ID を x-qfai-refs に記載
1
4
  openapi: 3.0.0
2
5
  info:
3
6
  title: QFAI Sample API
@@ -1,5 +1,6 @@
1
- -- DATA-0001
1
+ -- DATA-0001 (DB contract sample)
2
+ -- 破壊的 SQL (削除/破棄系) は警告対象
2
3
  CREATE TABLE sample_table (
3
4
  id INTEGER PRIMARY KEY,
4
5
  name VARCHAR(255) NOT NULL
5
- );
6
+ );
@@ -0,0 +1,6 @@
1
+ # UI contract sample (UI-0001)
2
+ # - 必須: id (例: UI-0001), name, refs
3
+ id: UI-0001
4
+ name: Order Registration
5
+ refs:
6
+ - BR-0001
@@ -0,0 +1,17 @@
1
+ # Output (.qfai/out)
2
+
3
+ `qfai validate` と `qfai report` の出力先です。
4
+
5
+ ## 生成されるファイル
6
+
7
+ - `validate.json` : 検証結果(JSON)
8
+ - `report.md` / `report.json` : レポート
9
+
10
+ ## 運用メモ
11
+
12
+ - 原則として **コミットしない** ことを推奨します
13
+ - `.gitignore` への追記例:
14
+
15
+ ```
16
+ .qfai/out/
17
+ ```
@@ -0,0 +1,32 @@
1
+ # Prompts (手動利用)
2
+
3
+ このディレクトリのプロンプトは **手動で使う資産**です。v0.2.6 では自動読取を行いません。
4
+
5
+ ## 目的
6
+
7
+ - Spec から overview / Business Flow を生成するための素材
8
+ - 将来(v0.9)の adapter/emit 実装に備えた配布物
9
+
10
+ ## 使い方(例)
11
+
12
+ 1. 目的のプロンプトを開く(例: `makeOverview.md`)
13
+ 2. そのまま AI エージェントに貼り付ける
14
+ 3. 指示された出力先に生成結果を保存する
15
+
16
+ ### エージェント別の手動導線(例)
17
+
18
+ - Copilot: `.github/copilot-instructions.md` に要旨を転記
19
+ - Claude: `CLAUDE.md` に要旨を転記
20
+ - Codex: `AGENTS.md` に要旨を転記
21
+
22
+ ※ いずれも **自動生成はしません**。必要に応じて人手で同期してください。
23
+
24
+ ## 出力先の例
25
+
26
+ - Overview: `docs/specs/overview.md`
27
+ - Business Flow: `docs/flows/bf-0001-<slug>.md`
28
+
29
+ ## CI との関係
30
+
31
+ - プロンプト自体は CI の検査対象ではありません
32
+ - 生成物をレビューし、Spec/Scenario/Contracts と整合しているかを確認してください
@@ -5,7 +5,7 @@ Spec群を読み、Specに明示されている情報のみを根拠として、
5
5
 
6
6
  ## Inputs
7
7
 
8
- - 対象: qfai/spec/spec.md と qfai/spec/spec-0001-\*.md 形式のファイル(4 桁の数字 + ハイフン + slug。実際のパターン: `spec-\d{4}-[^/\\]+\.md`。存在するもの全て)
8
+ - 対象: .qfai/spec/spec-0001-\*.md 形式のファイル(4 桁の数字 + ハイフン + slug。実際のパターン: `spec-\d{4}-[^/\\]+\.md`。存在するもの全て)
9
9
 
10
10
  ## Output (Option)
11
11
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## Inputs
6
6
 
7
- - 対象: qfai/spec/spec.md と qfai/spec/spec-0001-\*.md 形式のファイル(4 桁の数字 + ハイフン + slug。実際のパターン: `spec-\d{4}-[^/\\]+\.md`。存在するもの全て)
7
+ - 対象: .qfai/spec/spec-0001-\*.md 形式のファイル(4 桁の数字 + ハイフン + slug。実際のパターン: `spec-\d{4}-[^/\\]+\.md`。存在するもの全て)
8
8
 
9
9
  ## Output
10
10
 
@@ -0,0 +1,77 @@
1
+ # Spec / Scenario / Decisions
2
+
3
+ このディレクトリは「仕様(Spec)」「シナリオ(Scenario)」「意思決定(ADR)」の入口です。
4
+
5
+ ## 置くべきファイル
6
+
7
+ - Spec: `spec-0001-<slug>.md`(必須)
8
+ - Scenario: `scenarios/*.feature`
9
+ - Decisions: `decisions/ADR-0001.md` など
10
+
11
+ ## 最小例(Spec)
12
+
13
+ ```md
14
+ # SPEC-0001: 注文登録の最小要件
15
+
16
+ ## 背景
17
+
18
+ - 例: 受注の登録ルールを明文化し、手戻りを減らすため
19
+
20
+ ## スコープ
21
+
22
+ - 例: 新規受注の登録と承認
23
+
24
+ ## 非ゴール
25
+
26
+ - 例: 既存受注の履歴移行は対象外
27
+
28
+ ## 用語
29
+
30
+ - 例: 受注 = 顧客からの注文情報
31
+
32
+ ## 前提
33
+
34
+ - 例: 承認者は1名以上配置されている
35
+
36
+ ## 決定事項
37
+
38
+ - 例: 承認は1段階で完了とする
39
+
40
+ ## 業務ルール
41
+
42
+ - [BR-0001] 受注は承認者が承認するまで確定しない
43
+ - [BR-0002] 承認済みの受注のみ出荷依頼に進める
44
+ ```
45
+
46
+ ## BR の書き方(重要)
47
+
48
+ - **1 ルール = 1 BR** を守る
49
+ - 小項目がある場合は **別 BR を採番**する(`BR-0001.1` は使わない)
50
+ - 参照は常に BR ID を使う
51
+
52
+ ## Scenario の最小要件
53
+
54
+ - `@SC-xxxx` / `@SPEC-xxxx` / `@BR-xxxx` をタグで明示
55
+ - `Given / When / Then` を含める
56
+ - UI/API/DATA 契約に接続する(トレーサビリティのエラー回避)
57
+
58
+ ## CI でチェックされること(抜粋)
59
+
60
+ - Spec: 必須セクションの有無、SPEC/BR ID の存在、ID 形式
61
+ - Scenario: SC/SPEC/BR の参照、Given/When/Then の有無
62
+ - Traceability: BR→SC、SC→契約(UI/API/DATA)の接続
63
+
64
+ ## 依存関係
65
+
66
+ - Spec → Scenario → Contracts
67
+ - Decisions(ADR)→ Spec / BR
68
+
69
+ ## 良い例 / 悪い例
70
+
71
+ - 良い例: `BR-0001` が Scenario で参照され、UI/API/DATA のいずれかに接続している
72
+ - 悪い例: Spec に `SC-xxxx` を書く(Spec は SC を参照しない)
73
+
74
+ ## 良い運用 / 悪い運用
75
+
76
+ - 良い運用: Spec/Scenario/Contracts を同じ ID でつなぐ
77
+ - 悪い運用: Spec の BR が Scenario に出てこない(孤立)
@@ -0,0 +1,9 @@
1
+ # ADR-0001: 承認フローは1段階にする
2
+
3
+ > このファイルは「なぜその判断をしたか」を残すためのテンプレです。
4
+
5
+ - Status: Proposed
6
+ - Context: 承認者を増やすと運用が複雑になる
7
+ - Decision: v0.2.6 では1段階の承認に固定する
8
+ - Consequences: 多段承認が必要な場合は拡張が必要
9
+ - Related: BR-0001, SPEC-0001
@@ -0,0 +1,36 @@
1
+ # ADR (Architecture Decision Record)
2
+
3
+ ADR は「なぜその判断をしたか」を記録するための軽量な意思決定ログです。
4
+
5
+ ## いつ書くか
6
+
7
+ - 仕様の前提や制約が変わるとき
8
+ - 技術選定や設計方針を決めたとき
9
+ - 重要なトレードオフがあるとき
10
+
11
+ ## 最小例
12
+
13
+ ```md
14
+ # ADR-0001: 承認フローは1段階にする
15
+
16
+ - Status: Proposed
17
+ - Context: 承認者を増やすと運用が複雑になる
18
+ - Decision: v0.2.6 では1段階の承認に固定する
19
+ - Consequences: 多段承認が必要な場合は拡張が必要
20
+ - Related: BR-0001, SPEC-0001
21
+ ```
22
+
23
+ ## CI でチェックされること(抜粋)
24
+
25
+ - ID 形式(`BR-xxxx` / `SPEC-xxxx` など)
26
+ - 参照 ID の整合性(トレーサビリティ)
27
+
28
+ ## 依存関係
29
+
30
+ - ADR は Spec / BR と一緒に参照される
31
+ - Scenario/Contracts から参照されることは少ない
32
+
33
+ ## 良い例 / 悪い例
34
+
35
+ - 良い例: Context/Decision/Consequences が簡潔に書かれている
36
+ - 悪い例: Decision が空のまま放置されている
@@ -0,0 +1,6 @@
1
+ @SC-0001 @BR-0001 @SPEC-0001 @UI-0001 @API-0001 @DATA-0001
2
+ Feature: Order registration
3
+ Scenario: Register a new order
4
+ Given no order exists for the customer
5
+ When the user submits a new order
6
+ Then the order is created as pending approval
@@ -0,0 +1,36 @@
1
+ # SPEC-0001: 注文登録の最小仕様(サンプル)
2
+
3
+ > このテンプレは **最小例** です。実際の仕様に合わせて書き換えてください。
4
+
5
+ ## 背景
6
+
7
+ - 例: 受注の登録ルールを統一し、手戻りを減らす
8
+
9
+ ## スコープ
10
+
11
+ - 例: 新規受注の登録と承認
12
+
13
+ ## 非ゴール
14
+
15
+ - 例: 既存受注の履歴移行は対象外
16
+
17
+ ## 用語
18
+
19
+ - 例: 受注 = 顧客からの注文情報
20
+
21
+ ## 前提
22
+
23
+ - 例: 承認者は1名以上配置されている
24
+
25
+ ## 決定事項
26
+
27
+ - 例: 承認は1段階で完了とする
28
+
29
+ ## 業務ルール
30
+
31
+ - [BR-0001] 受注は承認者が承認するまで確定しない
32
+
33
+ ### 書き方メモ
34
+
35
+ - BR は **原子ルール** として採番する(`BR-0001.1` は使わない)
36
+ - Spec では **SC ID** を参照しない
@@ -1,12 +1,12 @@
1
1
  paths:
2
- specDir: qfai/spec
3
- decisionsDir: qfai/spec/decisions
4
- scenariosDir: qfai/spec
5
- rulesDir: qfai/rules
6
- contractsDir: qfai/contracts
7
- uiContractsDir: qfai/contracts/ui
8
- apiContractsDir: qfai/contracts/api
9
- dataContractsDir: qfai/contracts/db
2
+ specDir: .qfai/spec
3
+ decisionsDir: .qfai/spec/decisions
4
+ scenariosDir: .qfai/spec/scenarios
5
+ rulesDir: .qfai/rules
6
+ contractsDir: .qfai/contracts
7
+ uiContractsDir: .qfai/contracts/ui
8
+ apiContractsDir: .qfai/contracts/api
9
+ dataContractsDir: .qfai/contracts/db
10
10
  srcDir: src
11
11
  testsDir: tests
12
12
  validation:
@@ -131,9 +131,9 @@ function error(message) {
131
131
  async function runInit(options) {
132
132
  const assetsRoot = getInitAssetsDir();
133
133
  const rootAssets = import_node_path3.default.join(assetsRoot, "root");
134
- const qfaiAssets = import_node_path3.default.join(assetsRoot, "qfai");
134
+ const qfaiAssets = import_node_path3.default.join(assetsRoot, ".qfai");
135
135
  const destRoot = import_node_path3.default.resolve(options.dir);
136
- const destQfai = import_node_path3.default.join(destRoot, "qfai");
136
+ const destQfai = import_node_path3.default.join(destRoot, ".qfai");
137
137
  const rootResult = await copyTemplateTree(rootAssets, destRoot, {
138
138
  force: options.force,
139
139
  dryRun: options.dryRun
@@ -169,14 +169,14 @@ var import_node_path4 = __toESM(require("path"), 1);
169
169
  var import_yaml = require("yaml");
170
170
  var defaultConfig = {
171
171
  paths: {
172
- specDir: "qfai/spec",
173
- decisionsDir: "qfai/spec/decisions",
174
- scenariosDir: "qfai/spec",
175
- rulesDir: "qfai/rules",
176
- contractsDir: "qfai/contracts",
177
- uiContractsDir: "qfai/contracts/ui",
178
- apiContractsDir: "qfai/contracts/api",
179
- dataContractsDir: "qfai/contracts/db",
172
+ specDir: ".qfai/spec",
173
+ decisionsDir: ".qfai/spec/decisions",
174
+ scenariosDir: ".qfai/spec/scenarios",
175
+ rulesDir: ".qfai/rules",
176
+ contractsDir: ".qfai/contracts",
177
+ uiContractsDir: ".qfai/contracts/ui",
178
+ apiContractsDir: ".qfai/contracts/api",
179
+ dataContractsDir: ".qfai/contracts/db",
180
180
  srcDir: "src",
181
181
  testsDir: "tests"
182
182
  },
@@ -582,8 +582,7 @@ async function exists2(target) {
582
582
  }
583
583
 
584
584
  // src/core/discovery.ts
585
- var LEGACY_SPEC_NAME = "spec.md";
586
- var SPEC_NAMED_PATTERN = /^spec-\d{4}-[^/\\]+\.md$/i;
585
+ var SPEC_NAMED_PATTERN = /^spec-\d{4}-[^/\\]+\.md$/;
587
586
  async function collectSpecFiles(specRoot) {
588
587
  const files = await collectFiles(specRoot, { extensions: [".md"] });
589
588
  return files.filter((file) => isSpecFile(file));
@@ -607,7 +606,7 @@ async function collectContractFiles(uiRoot, apiRoot, dataRoot) {
607
606
  }
608
607
  function isSpecFile(filePath) {
609
608
  const name = import_node_path6.default.basename(filePath).toLowerCase();
610
- return name === LEGACY_SPEC_NAME || SPEC_NAMED_PATTERN.test(name);
609
+ return SPEC_NAMED_PATTERN.test(name);
611
610
  }
612
611
 
613
612
  // src/core/ids.ts
@@ -668,8 +667,8 @@ var import_promises4 = require("fs/promises");
668
667
  var import_node_path7 = __toESM(require("path"), 1);
669
668
  var import_node_url2 = require("url");
670
669
  async function resolveToolVersion() {
671
- if ("0.2.5".length > 0) {
672
- return "0.2.5";
670
+ if ("0.2.6".length > 0) {
671
+ return "0.2.6";
673
672
  }
674
673
  try {
675
674
  const packagePath = resolvePackageJsonPath();
@@ -1068,10 +1067,11 @@ async function validateSpecs(root, config) {
1068
1067
  const specsRoot = resolvePath(root, config, "specDir");
1069
1068
  const files = await collectSpecFiles(specsRoot);
1070
1069
  if (files.length === 0) {
1070
+ const expected = "spec-0001-<slug>.md";
1071
1071
  return [
1072
1072
  issue3(
1073
1073
  "QFAI-SPEC-000",
1074
- "Spec \u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002",
1074
+ `Spec \u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u914D\u7F6E\u5834\u6240: ${config.paths.specDir} / \u671F\u5F85\u30D1\u30BF\u30FC\u30F3: ${expected}`,
1075
1075
  "info",
1076
1076
  specsRoot,
1077
1077
  "spec.files"