qfai 0.3.3 → 0.3.5

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 (165) hide show
  1. package/README.md +2 -2
  2. package/assets/init/.qfai/README.md +11 -0
  3. package/assets/init/.qfai/promptpack/commands/implement.md +6 -0
  4. package/assets/init/.qfai/promptpack/commands/plan.md +9 -0
  5. package/assets/init/.qfai/promptpack/commands/release.md +6 -0
  6. package/assets/init/.qfai/promptpack/commands/review.md +6 -0
  7. package/assets/init/.qfai/promptpack/constitution.md +15 -0
  8. package/assets/init/.qfai/promptpack/modes/change.md +4 -0
  9. package/assets/init/.qfai/promptpack/modes/compatibility.md +4 -0
  10. package/assets/init/.qfai/promptpack/roles/qa.md +4 -0
  11. package/assets/init/.qfai/promptpack/roles/spec.md +4 -0
  12. package/assets/init/.qfai/promptpack/roles/test.md +4 -0
  13. package/assets/init/.qfai/promptpack/steering/compatibility-vs-change.md +8 -0
  14. package/assets/init/.qfai/promptpack/steering/naming.md +7 -0
  15. package/assets/init/.qfai/promptpack/steering/traceability.md +9 -0
  16. package/assets/init/.qfai/prompts/require-to-spec.md +4 -4
  17. package/assets/init/.qfai/require/README.md +28 -0
  18. package/assets/init/.qfai/rules/conventions.md +6 -0
  19. package/dist/cli/commands/init.d.ts +8 -0
  20. package/dist/cli/commands/init.d.ts.map +1 -0
  21. package/dist/cli/commands/init.js +30 -0
  22. package/dist/cli/commands/init.js.map +1 -0
  23. package/dist/cli/commands/report.d.ts +7 -0
  24. package/dist/cli/commands/report.d.ts.map +1 -0
  25. package/dist/cli/commands/report.js +87 -0
  26. package/dist/cli/commands/report.js.map +1 -0
  27. package/dist/cli/commands/validate.d.ts +9 -0
  28. package/dist/cli/commands/validate.d.ts.map +1 -0
  29. package/dist/cli/commands/validate.js +57 -0
  30. package/dist/cli/commands/validate.js.map +1 -0
  31. package/dist/cli/index.cjs +2 -2
  32. package/dist/cli/index.d.ts +2 -0
  33. package/dist/cli/index.d.ts.map +1 -0
  34. package/dist/cli/index.js +7 -0
  35. package/dist/cli/index.js.map +1 -0
  36. package/dist/cli/index.mjs +2 -2
  37. package/dist/cli/lib/args.d.ts +18 -0
  38. package/dist/cli/lib/args.d.ts.map +1 -0
  39. package/dist/cli/lib/args.js +98 -0
  40. package/dist/cli/lib/args.js.map +1 -0
  41. package/dist/cli/lib/assets.d.ts +2 -0
  42. package/dist/cli/lib/assets.d.ts.map +1 -0
  43. package/dist/cli/lib/assets.js +24 -0
  44. package/dist/cli/lib/assets.js.map +1 -0
  45. package/dist/cli/lib/failOn.d.ts +5 -0
  46. package/dist/cli/lib/failOn.d.ts.map +1 -0
  47. package/dist/cli/lib/failOn.js +10 -0
  48. package/dist/cli/lib/failOn.js.map +1 -0
  49. package/dist/cli/lib/fs.d.ts +11 -0
  50. package/dist/cli/lib/fs.d.ts.map +1 -0
  51. package/dist/cli/lib/fs.js +91 -0
  52. package/dist/cli/lib/fs.js.map +1 -0
  53. package/dist/cli/lib/logger.d.ts +4 -0
  54. package/dist/cli/lib/logger.d.ts.map +1 -0
  55. package/dist/cli/lib/logger.js +10 -0
  56. package/dist/cli/lib/logger.js.map +1 -0
  57. package/dist/cli/main.d.ts +2 -0
  58. package/dist/cli/main.d.ts.map +1 -0
  59. package/dist/cli/main.js +66 -0
  60. package/dist/cli/main.js.map +1 -0
  61. package/dist/core/config.d.ts +44 -0
  62. package/dist/core/config.d.ts.map +1 -0
  63. package/dist/core/config.js +218 -0
  64. package/dist/core/config.js.map +1 -0
  65. package/dist/core/contractIndex.d.ts +13 -0
  66. package/dist/core/contractIndex.d.ts.map +1 -0
  67. package/dist/core/contractIndex.js +66 -0
  68. package/dist/core/contractIndex.js.map +1 -0
  69. package/dist/core/contracts.d.ts +5 -0
  70. package/dist/core/contracts.d.ts.map +1 -0
  71. package/dist/core/contracts.js +42 -0
  72. package/dist/core/contracts.js.map +1 -0
  73. package/dist/core/discovery.d.ts +14 -0
  74. package/dist/core/discovery.d.ts.map +1 -0
  75. package/dist/core/discovery.js +55 -0
  76. package/dist/core/discovery.js.map +1 -0
  77. package/dist/core/fs.d.ts +6 -0
  78. package/dist/core/fs.d.ts.map +1 -0
  79. package/dist/core/fs.js +55 -0
  80. package/dist/core/fs.js.map +1 -0
  81. package/dist/core/gherkin/parse.d.ts +7 -0
  82. package/dist/core/gherkin/parse.d.ts.map +1 -0
  83. package/dist/core/gherkin/parse.js +25 -0
  84. package/dist/core/gherkin/parse.js.map +1 -0
  85. package/dist/core/ids.d.ts +6 -0
  86. package/dist/core/ids.d.ts.map +1 -0
  87. package/dist/core/ids.js +52 -0
  88. package/dist/core/ids.js.map +1 -0
  89. package/dist/core/index.d.ts +13 -0
  90. package/dist/core/index.d.ts.map +1 -0
  91. package/dist/core/index.js +13 -0
  92. package/dist/core/index.js.map +1 -0
  93. package/dist/core/parse/adr.d.ts +13 -0
  94. package/dist/core/parse/adr.d.ts.map +1 -0
  95. package/dist/core/parse/adr.js +33 -0
  96. package/dist/core/parse/adr.js.map +1 -0
  97. package/dist/core/parse/gherkin.d.ts +12 -0
  98. package/dist/core/parse/gherkin.d.ts.map +1 -0
  99. package/dist/core/parse/gherkin.js +22 -0
  100. package/dist/core/parse/gherkin.js.map +1 -0
  101. package/dist/core/parse/markdown.d.ts +14 -0
  102. package/dist/core/parse/markdown.d.ts.map +1 -0
  103. package/dist/core/parse/markdown.js +45 -0
  104. package/dist/core/parse/markdown.js.map +1 -0
  105. package/dist/core/parse/spec.d.ts +28 -0
  106. package/dist/core/parse/spec.d.ts.map +1 -0
  107. package/dist/core/parse/spec.js +80 -0
  108. package/dist/core/parse/spec.js.map +1 -0
  109. package/dist/core/report.d.ts +39 -0
  110. package/dist/core/report.d.ts.map +1 -0
  111. package/dist/core/report.js +226 -0
  112. package/dist/core/report.js.map +1 -0
  113. package/dist/core/scenarioModel.d.ts +33 -0
  114. package/dist/core/scenarioModel.d.ts.map +1 -0
  115. package/dist/core/scenarioModel.js +130 -0
  116. package/dist/core/scenarioModel.js.map +1 -0
  117. package/dist/core/specLayout.d.ts +8 -0
  118. package/dist/core/specLayout.d.ts.map +1 -0
  119. package/dist/core/specLayout.js +36 -0
  120. package/dist/core/specLayout.js.map +1 -0
  121. package/dist/core/types.d.ts +27 -0
  122. package/dist/core/types.d.ts.map +1 -0
  123. package/dist/core/types.js +2 -0
  124. package/dist/core/types.js.map +1 -0
  125. package/dist/core/validate.d.ts +4 -0
  126. package/dist/core/validate.d.ts.map +1 -0
  127. package/dist/core/validate.js +36 -0
  128. package/dist/core/validate.js.map +1 -0
  129. package/dist/core/validators/contracts.d.ts +5 -0
  130. package/dist/core/validators/contracts.d.ts.map +1 -0
  131. package/dist/core/validators/contracts.js +162 -0
  132. package/dist/core/validators/contracts.js.map +1 -0
  133. package/dist/core/validators/delta.d.ts +4 -0
  134. package/dist/core/validators/delta.d.ts.map +1 -0
  135. package/dist/core/validators/delta.js +68 -0
  136. package/dist/core/validators/delta.js.map +1 -0
  137. package/dist/core/validators/ids.d.ts +4 -0
  138. package/dist/core/validators/ids.d.ts.map +1 -0
  139. package/dist/core/validators/ids.js +88 -0
  140. package/dist/core/validators/ids.js.map +1 -0
  141. package/dist/core/validators/scenario.d.ts +5 -0
  142. package/dist/core/validators/scenario.d.ts.map +1 -0
  143. package/dist/core/validators/scenario.js +137 -0
  144. package/dist/core/validators/scenario.js.map +1 -0
  145. package/dist/core/validators/spec.d.ts +5 -0
  146. package/dist/core/validators/spec.d.ts.map +1 -0
  147. package/dist/core/validators/spec.js +94 -0
  148. package/dist/core/validators/spec.js.map +1 -0
  149. package/dist/core/validators/traceability.d.ts +4 -0
  150. package/dist/core/validators/traceability.d.ts.map +1 -0
  151. package/dist/core/validators/traceability.js +180 -0
  152. package/dist/core/validators/traceability.js.map +1 -0
  153. package/dist/core/version.d.ts +2 -0
  154. package/dist/core/version.d.ts.map +1 -0
  155. package/dist/core/version.js +25 -0
  156. package/dist/core/version.js.map +1 -0
  157. package/dist/index.cjs +2 -2
  158. package/dist/index.d.ts +2 -133
  159. package/dist/index.d.ts.map +1 -0
  160. package/dist/index.js +2 -0
  161. package/dist/index.js.map +1 -0
  162. package/dist/index.mjs +2 -2
  163. package/dist/tsconfig.tsbuildinfo +1 -0
  164. package/package.json +1 -1
  165. package/assets/init/root/require/README.md +0 -28
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # QFAI Toolkit (v0.3.3)
1
+ # QFAI Toolkit (v0.3.5)
2
2
 
3
3
  Single-package distribution for QFAI.
4
4
 
@@ -18,7 +18,7 @@ npx qfai report
18
18
 
19
19
  ## できること
20
20
 
21
- - `npx qfai init` によるテンプレート生成(specs/contracts に加え、`require/README.md`、`.qfai/rules/pnpm.md`、`.qfai/prompts/require-to-spec.md` を含む)
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
23
  - `npx qfai report` によるレポート出力
24
24
 
@@ -13,18 +13,22 @@ npx qfai report
13
13
 
14
14
  - `specs/` : Spec Pack(spec.md / delta.md / scenario.md)
15
15
  - `contracts/` : UI / API / DB 契約を置く場所
16
+ - `require/` : 既存要件の集約(validate 対象外)
16
17
  - `rules/` : 規約・運用ルール
17
18
  - `prompts/` : 生成プロンプト資産(自動読取はしない)
19
+ - `promptpack/` : PromptPack(SSOT、運用ルール/観点の正本)
18
20
  - `out/` : `validate` / `report` の出力先(gitignore 推奨)
19
21
 
20
22
  詳細は各 README を参照してください。
21
23
 
22
24
  - `specs/README.md`
23
25
  - `contracts/README.md`
26
+ - `require/README.md`
24
27
  - `rules/conventions.md`
25
28
  - `rules/pnpm.md`
26
29
  - `prompts/README.md`
27
30
  - `prompts/require-to-spec.md`
31
+ - `promptpack/constitution.md`
28
32
  - `out/README.md`
29
33
 
30
34
  ## 設定と CI
@@ -43,3 +47,10 @@ npx qfai report
43
47
  - Codex: `AGENTS.md` に要旨を転記
44
48
 
45
49
  詳細は `prompts/README.md` を参照してください。
50
+
51
+ ## PromptPack の使い方(重要)
52
+
53
+ `promptpack/` は **運用ルール/観点の正本**です。自動読取は行わず、必要な章を手動で参照・転記します。
54
+
55
+ - 入口: `promptpack/constitution.md`
56
+ - 手動配置の例: Copilot/Claude/Codex 向けの指示ファイル
@@ -0,0 +1,6 @@
1
+ # Implement
2
+
3
+ - 既存の型/ユーティリティ/パターンを優先して再利用する
4
+ - 入力検証と失敗パスを先に書く
5
+ - 早期 return でネストを浅くする
6
+ - ログ/エラーメッセージは具体的かつ最小限にする
@@ -0,0 +1,9 @@
1
+ # Plan
2
+
3
+ 目的と完了条件を先に明確化し、以下を最小構成で整理する。
4
+
5
+ - ゴール/完了条件
6
+ - スコープ(やる/やらない)
7
+ - 手順(小さく分割)
8
+ - テスト方針
9
+ - リスクと確認点
@@ -0,0 +1,6 @@
1
+ # Release
2
+
3
+ - CHANGELOG と version を更新する
4
+ - `pnpm format:check && pnpm lint && pnpm check-types` を実行する
5
+ - `pnpm -C packages/qfai test` と `pnpm verify:pack` を実行する
6
+ - タグ付与は main の HEAD に対して行う
@@ -0,0 +1,6 @@
1
+ # Review
2
+
3
+ - Spec/Scenario/Contracts と実装の整合
4
+ - 互換維持/変更の区分が delta.md に記録されているか
5
+ - 影響範囲とテスト結果の妥当性
6
+ - セキュリティ/運用上の懸念がないか
@@ -0,0 +1,15 @@
1
+ # PromptPack Constitution
2
+
3
+ PromptPack はプロジェクト内の SSOT(Single Source of Truth)として扱う。
4
+
5
+ ## 基本原則
6
+
7
+ - spec/scenario/delta/BR/SC を最優先で読む
8
+ - 変更は delta.md に記録し、互換維持/変更の区分を明示する
9
+ - validate を通すことを必須とする(通らないなら仕様/運用が破綻している)
10
+ - 不確実性(仮説/未確定/TODO)は残し方針を統一する
11
+
12
+ ## 運用
13
+
14
+ - PromptPack は人が手動で参照する前提とする
15
+ - 自動配置は v0.9 の emit/adapter まで行わない
@@ -0,0 +1,4 @@
1
+ # Mode: Change
2
+
3
+ - 仕様変更の根拠を delta.md に必ず記録する
4
+ - 影響範囲を整理し、テストを増分で設計する
@@ -0,0 +1,4 @@
1
+ # Mode: Compatibility
2
+
3
+ - 既存仕様との整合を最優先にする
4
+ - 影響範囲を最小化し、回帰テストを重視する
@@ -0,0 +1,4 @@
1
+ # Role: QA
2
+
3
+ - 例外/境界値/運用時の挙動を中心に確認する
4
+ - 仕様とテストが一致しているかを検証する
@@ -0,0 +1,4 @@
1
+ # Role: Spec
2
+
3
+ - 仕様書と成果物の整合を優先する
4
+ - ID/参照/命名規約の逸脱を検出する
@@ -0,0 +1,4 @@
1
+ # Role: Test
2
+
3
+ - 振る舞い変更は再現テストを先に追加する
4
+ - 近傍の適切な層でカバーする
@@ -0,0 +1,8 @@
1
+ # Compatibility vs Change
2
+
3
+ 互換維持と仕様変更の区分は `rules/conventions.md` に従う。
4
+
5
+ - 互換維持: 既存の期待値を変えない
6
+ - 仕様変更: 期待値/挙動が変わる
7
+
8
+ 必ず `delta.md` に区分と根拠を記録する。
@@ -0,0 +1,7 @@
1
+ # Naming
2
+
3
+ 命名規約は `docs/rules/naming.md` を正とする。
4
+
5
+ - ID は `PREFIX-0001` 形式(4桁ゼロ埋め)
6
+ - 参照はファイル名ではなく ID を用いる
7
+ - 同一 ID の重複定義は禁止
@@ -0,0 +1,9 @@
1
+ # Traceability
2
+
3
+ 参照は下流→上流のみを許可する。
4
+
5
+ - SC は BR を参照する
6
+ - テスト/コードは SC を参照する
7
+ - Spec は契約/テストを参照しない
8
+
9
+ 違反は CI で検出される前提で運用する。
@@ -1,10 +1,10 @@
1
1
  # require-to-spec
2
2
 
3
- あなたは仕様書作成アシスタントです。`require/` 配下の既存要件を読み取り、QFAI の Spec Pack を作成してください。
3
+ あなたは仕様書作成アシスタントです。`.qfai/require/` 配下の既存要件を読み取り、QFAI の Spec Pack を作成してください。
4
4
 
5
5
  ## Inputs
6
6
 
7
- - `require/` 配下の要件定義書・リンク・原本(読み取れる範囲で)
7
+ - `.qfai/require/` 配下の要件定義書・リンク・原本(読み取れる範囲で)
8
8
  - 追加資料がある場合は、それも参照して良い
9
9
 
10
10
  ## Output
@@ -35,5 +35,5 @@
35
35
 
36
36
  ## 参照ルール(重要)
37
37
 
38
- - `.qfai/specs` や `contracts` は **require を参照してよい**。
39
- - `require/` 側から `.qfai/specs` や `contracts` を参照するのは **禁止**。
38
+ - `.qfai/specs` や `contracts` は **.qfai/require を参照してよい**。
39
+ - `.qfai/require` 側から `.qfai/specs` や `contracts` を参照するのは **禁止**。
@@ -0,0 +1,28 @@
1
+ # .qfai/require/
2
+
3
+ 既存の要件定義書や外部資料を集約するためのディレクトリです。
4
+ QFAI は `.qfai/require/` を **入力(上流)** として扱い、ここに置かれた内容を根拠に Spec を作成します。
5
+
6
+ ## 置き方(例)
7
+
8
+ - `.qfai/require/req-0001-<slug>.md`
9
+ - `.qfai/require/links.md`(外部ドキュメントへのリンク集)
10
+ - `.qfai/require/raw/`(PDFや画像などの原本)
11
+
12
+ > 形式は限定しません。内容が参照可能であることを優先してください。
13
+
14
+ ## 参照ルール(重要)
15
+
16
+ - `.qfai/require/` は **上流のSSOT** です。
17
+ - `.qfai/specs` や `contracts` は **.qfai/require を参照してよい**。
18
+ - `.qfai/require` 側から `.qfai/specs` や `contracts` を参照するのは **禁止**(循環参照防止)。
19
+
20
+ ## AI プロンプトの利用
21
+
22
+ - `.qfai/prompts/require-to-spec.md` を使用し、要件から Spec を作成します。
23
+ - 生成後は必ず人間がレビューし、Spec/Scenario/Contracts の整合を確認してください。
24
+
25
+ ## 注意
26
+
27
+ - `.qfai/require/` の内容は QFAI の validate 対象外です。
28
+ - 機密情報の取り扱いは各プロジェクトのルールに従ってください。
@@ -19,3 +19,9 @@
19
19
  - `delta.md` では **必ずどちらか1つにチェック**する
20
20
  - 両方ON/両方OFFは無効(エラー)
21
21
  - 迷った場合は「影響範囲」「受入観点」を追記して明文化する
22
+
23
+ ## OQ表記の扱い(対象範囲の限定)
24
+
25
+ - OQ表記の排除は、現行仕様として参照される場所に限定する
26
+ - 対象例: `packages/qfai/assets/init/.qfai/`, `.github/PULL_REQUEST_TEMPLATE.md`, `README.md`, `packages/qfai/README.md`
27
+ - 意思決定ログ/ロードマップ(例: `docs/roadmap/`)は対象外とし、履歴の削除を誘発しない
@@ -0,0 +1,8 @@
1
+ export type InitOptions = {
2
+ dir: string;
3
+ force: boolean;
4
+ dryRun: boolean;
5
+ yes: boolean;
6
+ };
7
+ export declare function runInit(options: InitOptions): Promise<void>;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd,CAAC;AAEF,wBAAsB,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBjE"}
@@ -0,0 +1,30 @@
1
+ import path from "node:path";
2
+ import { copyTemplateTree } from "../lib/fs.js";
3
+ import { getInitAssetsDir } from "../lib/assets.js";
4
+ import { info } from "../lib/logger.js";
5
+ export async function runInit(options) {
6
+ const assetsRoot = getInitAssetsDir();
7
+ const rootAssets = path.join(assetsRoot, "root");
8
+ const qfaiAssets = path.join(assetsRoot, ".qfai");
9
+ const destRoot = path.resolve(options.dir);
10
+ const destQfai = path.join(destRoot, ".qfai");
11
+ const rootResult = await copyTemplateTree(rootAssets, destRoot, {
12
+ force: options.force,
13
+ dryRun: options.dryRun,
14
+ });
15
+ const qfaiResult = await copyTemplateTree(qfaiAssets, destQfai, {
16
+ force: options.force,
17
+ dryRun: options.dryRun,
18
+ });
19
+ report([...rootResult.copied, ...qfaiResult.copied], [...rootResult.skipped, ...qfaiResult.skipped], options.dryRun, "init");
20
+ }
21
+ function report(copied, skipped, dryRun, label) {
22
+ info(`qfai ${label}: ${dryRun ? "dry-run" : "done"}`);
23
+ if (copied.length > 0) {
24
+ info(` created: ${copied.length}`);
25
+ }
26
+ if (skipped.length > 0) {
27
+ info(` skipped: ${skipped.length}`);
28
+ }
29
+ }
30
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AASxC,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAoB;IAChD,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;IACtC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE9C,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE;QAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,QAAQ,EAAE;QAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,CACJ,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,EAC5C,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,EAC9C,OAAO,CAAC,MAAM,EACd,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CACb,MAAgB,EAChB,OAAiB,EACjB,MAAe,EACf,KAAa;IAEb,IAAI,CAAC,QAAQ,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,cAAc,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type ReportOptions = {
2
+ root: string;
3
+ format: "md" | "json";
4
+ outPath?: string;
5
+ };
6
+ export declare function runReport(options: ReportOptions): Promise<void>;
7
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"AAeA,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAsB,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDrE"}
@@ -0,0 +1,87 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadConfig, resolvePath } from "../../core/config.js";
4
+ import { createReportData, formatReportJson, formatReportMarkdown, } from "../../core/report.js";
5
+ import { VALIDATION_SCHEMA_VERSION, } from "../../core/types.js";
6
+ import { error, info } from "../lib/logger.js";
7
+ export async function runReport(options) {
8
+ const root = path.resolve(options.root);
9
+ const configResult = await loadConfig(root);
10
+ const input = configResult.config.output.validateJsonPath;
11
+ const inputPath = path.isAbsolute(input) ? input : path.resolve(root, input);
12
+ let validation;
13
+ try {
14
+ validation = await readValidationResult(inputPath);
15
+ }
16
+ catch (err) {
17
+ if (isMissingFileError(err)) {
18
+ error([
19
+ `qfai report: 入力ファイルが見つかりません: ${inputPath}`,
20
+ "",
21
+ "まず qfai validate を実行してください。例:",
22
+ " qfai validate",
23
+ "(デフォルトの出力先: .qfai/out/validate.json)",
24
+ "",
25
+ "GitHub Actions テンプレを使っている場合は、workflow の validate ジョブを先に実行してください。",
26
+ ].join("\n"));
27
+ process.exitCode = 2;
28
+ return;
29
+ }
30
+ throw err;
31
+ }
32
+ const data = await createReportData(root, validation, configResult);
33
+ const output = options.format === "json"
34
+ ? formatReportJson(data)
35
+ : formatReportMarkdown(data);
36
+ const outRoot = resolvePath(root, configResult.config, "outDir");
37
+ const defaultOut = options.format === "json"
38
+ ? path.join(outRoot, "report.json")
39
+ : path.join(outRoot, "report.md");
40
+ const out = options.outPath ?? defaultOut;
41
+ const outPath = path.isAbsolute(out) ? out : path.resolve(root, out);
42
+ await mkdir(path.dirname(outPath), { recursive: true });
43
+ await writeFile(outPath, `${output}\n`, "utf-8");
44
+ info(`report: info=${validation.counts.info} warning=${validation.counts.warning} error=${validation.counts.error}`);
45
+ info(`wrote report: ${outPath}`);
46
+ }
47
+ async function readValidationResult(inputPath) {
48
+ const raw = await readFile(inputPath, "utf-8");
49
+ const parsed = JSON.parse(raw);
50
+ if (!isValidationResult(parsed)) {
51
+ throw new Error(`validate.json の形式が不正です: ${inputPath}`);
52
+ }
53
+ if (parsed.schemaVersion !== VALIDATION_SCHEMA_VERSION) {
54
+ throw new Error(`validate.json の schemaVersion が不一致です: expected ${VALIDATION_SCHEMA_VERSION}, actual ${parsed.schemaVersion}`);
55
+ }
56
+ return parsed;
57
+ }
58
+ function isValidationResult(value) {
59
+ if (!value || typeof value !== "object") {
60
+ return false;
61
+ }
62
+ const record = value;
63
+ if (typeof record.schemaVersion !== "string") {
64
+ return false;
65
+ }
66
+ if (typeof record.toolVersion !== "string") {
67
+ return false;
68
+ }
69
+ if (!Array.isArray(record.issues)) {
70
+ return false;
71
+ }
72
+ const counts = record.counts;
73
+ if (!counts) {
74
+ return false;
75
+ }
76
+ return (typeof counts.info === "number" &&
77
+ typeof counts.warning === "number" &&
78
+ typeof counts.error === "number");
79
+ }
80
+ function isMissingFileError(error) {
81
+ if (!error || typeof error !== "object") {
82
+ return false;
83
+ }
84
+ const record = error;
85
+ return record.code === "ENOENT";
86
+ }
87
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/cli/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { FailOn, OutputFormat } from "../../core/config.js";
2
+ export type ValidateOptions = {
3
+ root: string;
4
+ strict: boolean;
5
+ failOn?: FailOn;
6
+ format?: OutputFormat;
7
+ };
8
+ export declare function runValidate(options: ValidateOptions): Promise<number>;
9
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAMjE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEF,wBAAsB,WAAW,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB3E"}
@@ -0,0 +1,57 @@
1
+ import { mkdir, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { loadConfig } from "../../core/config.js";
4
+ import { validateProject } from "../../core/validate.js";
5
+ import { shouldFail } from "../lib/failOn.js";
6
+ export async function runValidate(options) {
7
+ const root = path.resolve(options.root);
8
+ const configResult = await loadConfig(root);
9
+ const result = await validateProject(root, configResult);
10
+ const format = options.format ?? "text";
11
+ if (format === "text") {
12
+ emitText(result);
13
+ }
14
+ if (format === "github") {
15
+ result.issues.forEach(emitGitHub);
16
+ }
17
+ await emitJson(result, root, configResult.config.output.validateJsonPath);
18
+ const failOn = resolveFailOn(options, configResult.config.validation.failOn);
19
+ return shouldFail(result, failOn) ? 1 : 0;
20
+ }
21
+ function resolveFailOn(options, fallback) {
22
+ if (options.failOn) {
23
+ return options.failOn;
24
+ }
25
+ if (options.strict) {
26
+ return "warning";
27
+ }
28
+ return fallback;
29
+ }
30
+ function emitText(result) {
31
+ for (const item of result.issues) {
32
+ const location = item.file ? ` (${item.file})` : "";
33
+ const refs = item.refs && item.refs.length > 0 ? ` refs=${item.refs.join(",")}` : "";
34
+ process.stdout.write(`[${item.severity}] ${item.code} ${item.message}${location}${refs}\n`);
35
+ }
36
+ process.stdout.write(`counts: info=${result.counts.info} warning=${result.counts.warning} error=${result.counts.error}\n`);
37
+ }
38
+ function emitGitHub(issue) {
39
+ const level = issue.severity === "error"
40
+ ? "error"
41
+ : issue.severity === "warning"
42
+ ? "warning"
43
+ : "notice";
44
+ const file = issue.file ? `file=${issue.file}` : "";
45
+ const line = issue.loc?.line ? `,line=${issue.loc.line}` : "";
46
+ const column = issue.loc?.column ? `,col=${issue.loc.column}` : "";
47
+ const location = file ? ` ${file}${line}${column}` : "";
48
+ process.stdout.write(`::${level}${location}::${issue.code}: ${issue.message}\n`);
49
+ }
50
+ async function emitJson(result, root, jsonPath) {
51
+ const abs = path.isAbsolute(jsonPath)
52
+ ? jsonPath
53
+ : path.resolve(root, jsonPath);
54
+ await mkdir(path.dirname(abs), { recursive: true });
55
+ await writeFile(abs, `${JSON.stringify(result, null, 2)}\n`, "utf-8");
56
+ }
57
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -716,8 +716,8 @@ var import_promises6 = require("fs/promises");
716
716
  var import_node_path7 = __toESM(require("path"), 1);
717
717
  var import_node_url2 = require("url");
718
718
  async function resolveToolVersion() {
719
- if ("0.3.3".length > 0) {
720
- return "0.3.3";
719
+ if ("0.3.5".length > 0) {
720
+ return "0.3.5";
721
721
  }
722
722
  try {
723
723
  const packagePath = resolvePackageJsonPath();
@@ -1 +1,3 @@
1
1
  #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { run } from "./main.js";
3
+ run(process.argv.slice(2), process.cwd()).catch((err) => {
4
+ process.stderr.write(`${err instanceof Error ? err.message : String(err)}\n`);
5
+ process.exitCode = 1;
6
+ });
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -693,8 +693,8 @@ import { readFile as readFile2 } from "fs/promises";
693
693
  import path7 from "path";
694
694
  import { fileURLToPath as fileURLToPath2 } from "url";
695
695
  async function resolveToolVersion() {
696
- if ("0.3.3".length > 0) {
697
- return "0.3.3";
696
+ if ("0.3.5".length > 0) {
697
+ return "0.3.5";
698
698
  }
699
699
  try {
700
700
  const packagePath = resolvePackageJsonPath();
@@ -0,0 +1,18 @@
1
+ export type ParsedArgs = {
2
+ command: string | null;
3
+ options: {
4
+ root: string;
5
+ dir: string;
6
+ force: boolean;
7
+ yes: boolean;
8
+ dryRun: boolean;
9
+ reportFormat: "md" | "json";
10
+ reportOut?: string;
11
+ validateFormat: "text" | "github";
12
+ strict: boolean;
13
+ failOn?: "never" | "warning" | "error";
14
+ help: boolean;
15
+ };
16
+ };
17
+ export declare function parseArgs(argv: string[], cwd: string): ParsedArgs;
18
+ //# sourceMappingURL=args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/args.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,YAAY,EAAE,IAAI,GAAG,MAAM,CAAC;QAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,MAAM,GAAG,QAAQ,CAAC;QAClC,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;QACvC,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;CACH,CAAC;AAEF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CA6EjE"}
@@ -0,0 +1,98 @@
1
+ export function parseArgs(argv, cwd) {
2
+ const options = {
3
+ root: cwd,
4
+ dir: cwd,
5
+ force: false,
6
+ yes: false,
7
+ dryRun: false,
8
+ reportFormat: "md",
9
+ validateFormat: "text",
10
+ strict: false,
11
+ help: false,
12
+ };
13
+ const args = [...argv];
14
+ let command = args.shift() ?? null;
15
+ if (command === "--help" || command === "-h") {
16
+ options.help = true;
17
+ command = null;
18
+ }
19
+ for (let i = 0; i < args.length; i += 1) {
20
+ const arg = args[i];
21
+ switch (arg) {
22
+ case "--root":
23
+ options.root = args[i + 1] ?? options.root;
24
+ i += 1;
25
+ break;
26
+ case "--dir":
27
+ options.dir = args[i + 1] ?? options.dir;
28
+ i += 1;
29
+ break;
30
+ case "--force":
31
+ options.force = true;
32
+ break;
33
+ case "--yes":
34
+ options.yes = true;
35
+ break;
36
+ case "--dry-run":
37
+ options.dryRun = true;
38
+ break;
39
+ case "--format": {
40
+ const next = args[i + 1];
41
+ applyFormatOption(command, next, options);
42
+ i += 1;
43
+ break;
44
+ }
45
+ case "--strict":
46
+ options.strict = true;
47
+ break;
48
+ case "--fail-on": {
49
+ const next = args[i + 1];
50
+ if (next === "never" || next === "warning" || next === "error") {
51
+ options.failOn = next;
52
+ }
53
+ i += 1;
54
+ break;
55
+ }
56
+ case "--out":
57
+ {
58
+ const next = args[i + 1];
59
+ if (next) {
60
+ options.reportOut = next;
61
+ }
62
+ }
63
+ i += 1;
64
+ break;
65
+ case "--help":
66
+ case "-h":
67
+ options.help = true;
68
+ break;
69
+ default:
70
+ break;
71
+ }
72
+ }
73
+ return { command, options };
74
+ }
75
+ function applyFormatOption(command, value, options) {
76
+ if (!value) {
77
+ return;
78
+ }
79
+ if (command === "report") {
80
+ if (value === "md" || value === "json") {
81
+ options.reportFormat = value;
82
+ }
83
+ return;
84
+ }
85
+ if (command === "validate") {
86
+ if (value === "text" || value === "github") {
87
+ options.validateFormat = value;
88
+ }
89
+ return;
90
+ }
91
+ if (value === "md" || value === "json") {
92
+ options.reportFormat = value;
93
+ }
94
+ if (value === "text" || value === "github") {
95
+ options.validateFormat = value;
96
+ }
97
+ }
98
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/cli/lib/args.ts"],"names":[],"mappings":"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"}