qfai 0.3.3 → 0.3.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 (147) hide show
  1. package/README.md +2 -2
  2. package/assets/init/.qfai/README.md +2 -0
  3. package/assets/init/.qfai/prompts/require-to-spec.md +4 -4
  4. package/assets/init/.qfai/require/README.md +28 -0
  5. package/dist/cli/commands/init.d.ts +8 -0
  6. package/dist/cli/commands/init.d.ts.map +1 -0
  7. package/dist/cli/commands/init.js +30 -0
  8. package/dist/cli/commands/init.js.map +1 -0
  9. package/dist/cli/commands/report.d.ts +7 -0
  10. package/dist/cli/commands/report.d.ts.map +1 -0
  11. package/dist/cli/commands/report.js +87 -0
  12. package/dist/cli/commands/report.js.map +1 -0
  13. package/dist/cli/commands/validate.d.ts +9 -0
  14. package/dist/cli/commands/validate.d.ts.map +1 -0
  15. package/dist/cli/commands/validate.js +57 -0
  16. package/dist/cli/commands/validate.js.map +1 -0
  17. package/dist/cli/index.d.ts +2 -0
  18. package/dist/cli/index.d.ts.map +1 -0
  19. package/dist/cli/index.js +7 -0
  20. package/dist/cli/index.js.map +1 -0
  21. package/dist/cli/lib/args.d.ts +18 -0
  22. package/dist/cli/lib/args.d.ts.map +1 -0
  23. package/dist/cli/lib/args.js +98 -0
  24. package/dist/cli/lib/args.js.map +1 -0
  25. package/dist/cli/lib/assets.d.ts +2 -0
  26. package/dist/cli/lib/assets.d.ts.map +1 -0
  27. package/dist/cli/lib/assets.js +24 -0
  28. package/dist/cli/lib/assets.js.map +1 -0
  29. package/dist/cli/lib/failOn.d.ts +5 -0
  30. package/dist/cli/lib/failOn.d.ts.map +1 -0
  31. package/dist/cli/lib/failOn.js +10 -0
  32. package/dist/cli/lib/failOn.js.map +1 -0
  33. package/dist/cli/lib/fs.d.ts +11 -0
  34. package/dist/cli/lib/fs.d.ts.map +1 -0
  35. package/dist/cli/lib/fs.js +91 -0
  36. package/dist/cli/lib/fs.js.map +1 -0
  37. package/dist/cli/lib/logger.d.ts +4 -0
  38. package/dist/cli/lib/logger.d.ts.map +1 -0
  39. package/dist/cli/lib/logger.js +10 -0
  40. package/dist/cli/lib/logger.js.map +1 -0
  41. package/dist/cli/main.d.ts +2 -0
  42. package/dist/cli/main.d.ts.map +1 -0
  43. package/dist/cli/main.js +66 -0
  44. package/dist/cli/main.js.map +1 -0
  45. package/dist/core/config.d.ts +44 -0
  46. package/dist/core/config.d.ts.map +1 -0
  47. package/dist/core/config.js +218 -0
  48. package/dist/core/config.js.map +1 -0
  49. package/dist/core/contractIndex.d.ts +13 -0
  50. package/dist/core/contractIndex.d.ts.map +1 -0
  51. package/dist/core/contractIndex.js +66 -0
  52. package/dist/core/contractIndex.js.map +1 -0
  53. package/dist/core/contracts.d.ts +5 -0
  54. package/dist/core/contracts.d.ts.map +1 -0
  55. package/dist/core/contracts.js +42 -0
  56. package/dist/core/contracts.js.map +1 -0
  57. package/dist/core/discovery.d.ts +14 -0
  58. package/dist/core/discovery.d.ts.map +1 -0
  59. package/dist/core/discovery.js +55 -0
  60. package/dist/core/discovery.js.map +1 -0
  61. package/dist/core/fs.d.ts +6 -0
  62. package/dist/core/fs.d.ts.map +1 -0
  63. package/dist/core/fs.js +55 -0
  64. package/dist/core/fs.js.map +1 -0
  65. package/dist/core/gherkin/parse.d.ts +7 -0
  66. package/dist/core/gherkin/parse.d.ts.map +1 -0
  67. package/dist/core/gherkin/parse.js +25 -0
  68. package/dist/core/gherkin/parse.js.map +1 -0
  69. package/dist/core/ids.d.ts +6 -0
  70. package/dist/core/ids.d.ts.map +1 -0
  71. package/dist/core/ids.js +52 -0
  72. package/dist/core/ids.js.map +1 -0
  73. package/dist/core/index.d.ts +13 -0
  74. package/dist/core/index.d.ts.map +1 -0
  75. package/dist/core/index.js +13 -0
  76. package/dist/core/index.js.map +1 -0
  77. package/dist/core/parse/adr.d.ts +13 -0
  78. package/dist/core/parse/adr.d.ts.map +1 -0
  79. package/dist/core/parse/adr.js +33 -0
  80. package/dist/core/parse/adr.js.map +1 -0
  81. package/dist/core/parse/gherkin.d.ts +12 -0
  82. package/dist/core/parse/gherkin.d.ts.map +1 -0
  83. package/dist/core/parse/gherkin.js +22 -0
  84. package/dist/core/parse/gherkin.js.map +1 -0
  85. package/dist/core/parse/markdown.d.ts +14 -0
  86. package/dist/core/parse/markdown.d.ts.map +1 -0
  87. package/dist/core/parse/markdown.js +45 -0
  88. package/dist/core/parse/markdown.js.map +1 -0
  89. package/dist/core/parse/spec.d.ts +28 -0
  90. package/dist/core/parse/spec.d.ts.map +1 -0
  91. package/dist/core/parse/spec.js +80 -0
  92. package/dist/core/parse/spec.js.map +1 -0
  93. package/dist/core/report.d.ts +39 -0
  94. package/dist/core/report.d.ts.map +1 -0
  95. package/dist/core/report.js +226 -0
  96. package/dist/core/report.js.map +1 -0
  97. package/dist/core/scenarioModel.d.ts +33 -0
  98. package/dist/core/scenarioModel.d.ts.map +1 -0
  99. package/dist/core/scenarioModel.js +130 -0
  100. package/dist/core/scenarioModel.js.map +1 -0
  101. package/dist/core/specLayout.d.ts +8 -0
  102. package/dist/core/specLayout.d.ts.map +1 -0
  103. package/dist/core/specLayout.js +36 -0
  104. package/dist/core/specLayout.js.map +1 -0
  105. package/dist/core/types.d.ts +27 -0
  106. package/dist/core/types.d.ts.map +1 -0
  107. package/dist/core/types.js +2 -0
  108. package/dist/core/types.js.map +1 -0
  109. package/dist/core/validate.d.ts +4 -0
  110. package/dist/core/validate.d.ts.map +1 -0
  111. package/dist/core/validate.js +36 -0
  112. package/dist/core/validate.js.map +1 -0
  113. package/dist/core/validators/contracts.d.ts +5 -0
  114. package/dist/core/validators/contracts.d.ts.map +1 -0
  115. package/dist/core/validators/contracts.js +162 -0
  116. package/dist/core/validators/contracts.js.map +1 -0
  117. package/dist/core/validators/delta.d.ts +4 -0
  118. package/dist/core/validators/delta.d.ts.map +1 -0
  119. package/dist/core/validators/delta.js +68 -0
  120. package/dist/core/validators/delta.js.map +1 -0
  121. package/dist/core/validators/ids.d.ts +4 -0
  122. package/dist/core/validators/ids.d.ts.map +1 -0
  123. package/dist/core/validators/ids.js +88 -0
  124. package/dist/core/validators/ids.js.map +1 -0
  125. package/dist/core/validators/scenario.d.ts +5 -0
  126. package/dist/core/validators/scenario.d.ts.map +1 -0
  127. package/dist/core/validators/scenario.js +137 -0
  128. package/dist/core/validators/scenario.js.map +1 -0
  129. package/dist/core/validators/spec.d.ts +5 -0
  130. package/dist/core/validators/spec.d.ts.map +1 -0
  131. package/dist/core/validators/spec.js +94 -0
  132. package/dist/core/validators/spec.js.map +1 -0
  133. package/dist/core/validators/traceability.d.ts +4 -0
  134. package/dist/core/validators/traceability.d.ts.map +1 -0
  135. package/dist/core/validators/traceability.js +180 -0
  136. package/dist/core/validators/traceability.js.map +1 -0
  137. package/dist/core/version.d.ts +2 -0
  138. package/dist/core/version.d.ts.map +1 -0
  139. package/dist/core/version.js +25 -0
  140. package/dist/core/version.js.map +1 -0
  141. package/dist/index.d.ts +2 -133
  142. package/dist/index.d.ts.map +1 -0
  143. package/dist/index.js +2 -0
  144. package/dist/index.js.map +1 -0
  145. package/dist/tsconfig.tsbuildinfo +1 -0
  146. package/package.json +1 -1
  147. 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.4)
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` を含む)
22
22
  - `npx qfai validate` による `.qfai/` 内ドキュメントの整合性・トレーサビリティ検査
23
23
  - `npx qfai report` によるレポート出力
24
24
 
@@ -13,6 +13,7 @@ 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/` : 生成プロンプト資産(自動読取はしない)
18
19
  - `out/` : `validate` / `report` の出力先(gitignore 推奨)
@@ -21,6 +22,7 @@ npx qfai report
21
22
 
22
23
  - `specs/README.md`
23
24
  - `contracts/README.md`
25
+ - `require/README.md`
24
26
  - `rules/conventions.md`
25
27
  - `rules/pnpm.md`
26
28
  - `prompts/README.md`
@@ -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
+ - 機密情報の取り扱いは各プロジェクトのルールに従ってください。
@@ -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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"}
@@ -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"}
@@ -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":"AAiBA,MAAM,UAAU,SAAS,CAAC,IAAc,EAAE,GAAW;IACnD,MAAM,OAAO,GAA0B;QACrC,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,KAAK,EAAE,KAAK;QACZ,GAAG,EAAE,KAAK;QACV,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,MAAM;QACtB,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,KAAK;KACZ,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IACvB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC;IAEnC,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ;gBACX,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC;gBAC3C,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC;gBACzC,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,KAAK,SAAS;gBACZ,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;gBACrB,MAAM;YACR,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;gBACnB,MAAM;YACR,KAAK,WAAW;gBACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC1C,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,UAAU;gBACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,MAAM;YACR,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACzB,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC/D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACxB,CAAC;gBACD,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,CAAC;YACD,KAAK,OAAO;gBACV,CAAC;oBACC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACzB,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;oBAC3B,CAAC;gBACH,CAAC;gBACD,CAAC,IAAI,CAAC,CAAC;gBACP,MAAM;YACR,KAAK,QAAQ,CAAC;YACd,KAAK,IAAI;gBACP,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;gBACpB,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,iBAAiB,CACxB,OAAsB,EACtB,KAAyB,EACzB,OAA8B;IAE9B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACvC,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;QAC/B,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC3C,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;QACjC,CAAC;QACD,OAAO;IACT,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACvC,OAAO,CAAC,YAAY,GAAG,KAAK,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,CAAC,cAAc,GAAG,KAAK,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function getInitAssetsDir(): string;
2
+ //# sourceMappingURL=assets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/assets.ts"],"names":[],"mappings":"AAIA,wBAAgB,gBAAgB,IAAI,MAAM,CAuBzC"}
@@ -0,0 +1,24 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ export function getInitAssetsDir() {
5
+ const base = import.meta.url;
6
+ const basePath = base.startsWith("file:") ? fileURLToPath(base) : base;
7
+ const baseDir = path.dirname(basePath);
8
+ // src/cli/lib と dist/cli/lib からの解決を想定する。
9
+ const candidates = [
10
+ path.resolve(baseDir, "../../../assets/init"),
11
+ path.resolve(baseDir, "../../assets/init"),
12
+ ];
13
+ for (const candidate of candidates) {
14
+ if (existsSync(candidate)) {
15
+ return candidate;
16
+ }
17
+ }
18
+ throw new Error([
19
+ "init 用テンプレートが見つかりません。Template assets not found.",
20
+ "確認したパス / Checked paths:",
21
+ ...candidates.map((candidate) => `- ${candidate}`),
22
+ ].join("\n"));
23
+ }
24
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/cli/lib/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,gBAAgB;IAC9B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,yCAAyC;IACzC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,sBAAsB,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC;KAC3C,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb;QACE,iDAAiD;QACjD,yBAAyB;QACzB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,SAAS,EAAE,CAAC;KACnD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FailOn } from "../../core/config.js";
2
+ import type { ValidationResult } from "../../core/types.js";
3
+ export type { FailOn };
4
+ export declare function shouldFail(result: ValidationResult, failOn: FailOn): boolean;
5
+ //# sourceMappingURL=failOn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failOn.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/failOn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,YAAY,EAAE,MAAM,EAAE,CAAC;AAEvB,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAQ5E"}
@@ -0,0 +1,10 @@
1
+ export function shouldFail(result, failOn) {
2
+ if (failOn === "never") {
3
+ return false;
4
+ }
5
+ if (failOn === "error") {
6
+ return result.counts.error > 0;
7
+ }
8
+ return result.counts.error + result.counts.warning > 0;
9
+ }
10
+ //# sourceMappingURL=failOn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failOn.js","sourceRoot":"","sources":["../../../src/cli/lib/failOn.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,MAAwB,EAAE,MAAc;IACjE,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type CopyOptions = {
2
+ force: boolean;
3
+ dryRun: boolean;
4
+ };
5
+ export type CopyResult = {
6
+ copied: string[];
7
+ skipped: string[];
8
+ };
9
+ export declare function copyTemplateTree(sourceRoot: string, destRoot: string, options: CopyOptions): Promise<CopyResult>;
10
+ export declare function copyTemplatePaths(sourceRoot: string, destRoot: string, relativePaths: string[], options: CopyOptions): Promise<CopyResult>;
11
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../../src/cli/lib/fs.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAEF,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EAAE,EACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CASrB"}
@@ -0,0 +1,91 @@
1
+ import { access, copyFile, mkdir, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export async function copyTemplateTree(sourceRoot, destRoot, options) {
4
+ const files = await collectTemplateFiles(sourceRoot);
5
+ return copyFiles(files, sourceRoot, destRoot, options);
6
+ }
7
+ export async function copyTemplatePaths(sourceRoot, destRoot, relativePaths, options) {
8
+ const allFiles = [];
9
+ for (const relPath of relativePaths) {
10
+ const fullPath = path.join(sourceRoot, relPath);
11
+ const files = await collectTemplateFiles(fullPath);
12
+ allFiles.push(...files);
13
+ }
14
+ return copyFiles(allFiles, sourceRoot, destRoot, options);
15
+ }
16
+ async function copyFiles(files, sourceRoot, destRoot, options) {
17
+ const copied = [];
18
+ const skipped = [];
19
+ const conflicts = [];
20
+ if (!options.force) {
21
+ for (const file of files) {
22
+ const relative = path.relative(sourceRoot, file);
23
+ const dest = path.join(destRoot, relative);
24
+ if (!(await shouldWrite(dest, options.force))) {
25
+ conflicts.push(dest);
26
+ }
27
+ }
28
+ if (conflicts.length > 0) {
29
+ throw new Error(formatConflictMessage(conflicts));
30
+ }
31
+ }
32
+ for (const file of files) {
33
+ const relative = path.relative(sourceRoot, file);
34
+ const dest = path.join(destRoot, relative);
35
+ if (!(await shouldWrite(dest, options.force))) {
36
+ skipped.push(dest);
37
+ continue;
38
+ }
39
+ if (!options.dryRun) {
40
+ await mkdir(path.dirname(dest), { recursive: true });
41
+ await copyFile(file, dest);
42
+ }
43
+ copied.push(dest);
44
+ }
45
+ return { copied, skipped };
46
+ }
47
+ function formatConflictMessage(conflicts) {
48
+ return [
49
+ "既存ファイルと衝突しました。安全のため停止します。",
50
+ "",
51
+ "衝突ファイル:",
52
+ ...conflicts.map((conflict) => `- ${conflict}`),
53
+ "",
54
+ "上書きして続行する場合は --force を付けて再実行してください。",
55
+ ].join("\n");
56
+ }
57
+ async function collectTemplateFiles(root) {
58
+ const entries = [];
59
+ if (!(await exists(root))) {
60
+ return entries;
61
+ }
62
+ const items = await readdir(root, { withFileTypes: true });
63
+ for (const item of items) {
64
+ const fullPath = path.join(root, item.name);
65
+ if (item.isDirectory()) {
66
+ const nested = await collectTemplateFiles(fullPath);
67
+ entries.push(...nested);
68
+ continue;
69
+ }
70
+ if (item.isFile()) {
71
+ entries.push(fullPath);
72
+ }
73
+ }
74
+ return entries;
75
+ }
76
+ async function shouldWrite(target, force) {
77
+ if (force) {
78
+ return true;
79
+ }
80
+ return !(await exists(target));
81
+ }
82
+ async function exists(target) {
83
+ try {
84
+ await access(target);
85
+ return true;
86
+ }
87
+ catch {
88
+ return false;
89
+ }
90
+ }
91
+ //# sourceMappingURL=fs.js.map