@sk8metal/michi-cli 0.14.1 → 0.19.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.
Files changed (614) hide show
  1. package/CHANGELOG.md +268 -2
  2. package/README.md +27 -2
  3. package/dist/scripts/config/config-schema.d.ts +5 -333
  4. package/dist/scripts/config/config-schema.d.ts.map +1 -1
  5. package/dist/scripts/config/config-schema.js +6 -233
  6. package/dist/scripts/config/config-schema.js.map +1 -1
  7. package/dist/scripts/config-global.d.ts.map +1 -1
  8. package/dist/scripts/config-global.js +3 -2
  9. package/dist/scripts/config-global.js.map +1 -1
  10. package/dist/scripts/confluence-sync.d.ts +5 -73
  11. package/dist/scripts/confluence-sync.d.ts.map +1 -1
  12. package/dist/scripts/confluence-sync.js +14 -392
  13. package/dist/scripts/confluence-sync.js.map +1 -1
  14. package/dist/scripts/constants/environments.d.ts +3 -30
  15. package/dist/scripts/constants/environments.d.ts.map +1 -1
  16. package/dist/scripts/constants/environments.js +3 -41
  17. package/dist/scripts/constants/environments.js.map +1 -1
  18. package/dist/scripts/constants/languages.d.ts +3 -20
  19. package/dist/scripts/constants/languages.d.ts.map +1 -1
  20. package/dist/scripts/constants/languages.js +3 -50
  21. package/dist/scripts/constants/languages.js.map +1 -1
  22. package/dist/scripts/constants/test-commands.d.ts +3 -33
  23. package/dist/scripts/constants/test-commands.d.ts.map +1 -1
  24. package/dist/scripts/constants/test-commands.js +3 -67
  25. package/dist/scripts/constants/test-commands.js.map +1 -1
  26. package/dist/scripts/dev-tools/mermaid-converter.d.ts.map +1 -0
  27. package/dist/scripts/dev-tools/mermaid-converter.js.map +1 -0
  28. package/dist/scripts/dev-tools/test-interactive.d.ts.map +1 -0
  29. package/dist/scripts/{test-interactive.js → dev-tools/test-interactive.js} +4 -3
  30. package/dist/scripts/dev-tools/test-interactive.js.map +1 -0
  31. package/dist/scripts/github-actions-client.d.ts +5 -75
  32. package/dist/scripts/github-actions-client.d.ts.map +1 -1
  33. package/dist/scripts/github-actions-client.js +4 -178
  34. package/dist/scripts/github-actions-client.js.map +1 -1
  35. package/dist/scripts/jira-sync.d.ts +3 -121
  36. package/dist/scripts/jira-sync.d.ts.map +1 -1
  37. package/dist/scripts/jira-sync.js +5 -879
  38. package/dist/scripts/jira-sync.js.map +1 -1
  39. package/dist/scripts/markdown-to-confluence.d.ts.map +1 -1
  40. package/dist/scripts/markdown-to-confluence.js +2 -2
  41. package/dist/scripts/markdown-to-confluence.js.map +1 -1
  42. package/dist/scripts/multi-project-estimate.d.ts.map +1 -1
  43. package/dist/scripts/multi-project-estimate.js +3 -2
  44. package/dist/scripts/multi-project-estimate.js.map +1 -1
  45. package/dist/scripts/phase-runner.d.ts.map +1 -1
  46. package/dist/scripts/phase-runner.js +34 -18
  47. package/dist/scripts/phase-runner.js.map +1 -1
  48. package/dist/scripts/pre-flight-check.d.ts.map +1 -1
  49. package/dist/scripts/pre-flight-check.js +27 -11
  50. package/dist/scripts/pre-flight-check.js.map +1 -1
  51. package/dist/scripts/template/multi-repo-renderer.js +2 -2
  52. package/dist/scripts/template/multi-repo-renderer.js.map +1 -1
  53. package/dist/scripts/test-execution-generator.d.ts.map +1 -1
  54. package/dist/scripts/test-execution-generator.js +5 -4
  55. package/dist/scripts/test-execution-generator.js.map +1 -1
  56. package/dist/scripts/utils/aidlc-parser.d.ts +5 -82
  57. package/dist/scripts/utils/aidlc-parser.d.ts.map +1 -1
  58. package/dist/scripts/utils/aidlc-parser.js +4 -204
  59. package/dist/scripts/utils/aidlc-parser.js.map +1 -1
  60. package/dist/scripts/utils/ci-generator.d.ts.map +1 -1
  61. package/dist/scripts/utils/ci-generator.js +4 -3
  62. package/dist/scripts/utils/ci-generator.js.map +1 -1
  63. package/dist/scripts/utils/config-loader.d.ts.map +1 -1
  64. package/dist/scripts/utils/config-loader.js +46 -49
  65. package/dist/scripts/utils/config-loader.js.map +1 -1
  66. package/dist/scripts/utils/config-validator.d.ts +9 -10
  67. package/dist/scripts/utils/config-validator.d.ts.map +1 -1
  68. package/dist/scripts/utils/config-validator.js +68 -70
  69. package/dist/scripts/utils/config-validator.js.map +1 -1
  70. package/dist/scripts/utils/docker-requirement-detector.d.ts.map +1 -1
  71. package/dist/scripts/utils/docker-requirement-detector.js +5 -4
  72. package/dist/scripts/utils/docker-requirement-detector.js.map +1 -1
  73. package/dist/scripts/utils/env-config.d.ts.map +1 -1
  74. package/dist/scripts/utils/env-config.js +55 -38
  75. package/dist/scripts/utils/env-config.js.map +1 -1
  76. package/dist/scripts/utils/feature-name-validator.d.ts +4 -9
  77. package/dist/scripts/utils/feature-name-validator.d.ts.map +1 -1
  78. package/dist/scripts/utils/feature-name-validator.js +12 -21
  79. package/dist/scripts/utils/feature-name-validator.js.map +1 -1
  80. package/dist/scripts/utils/interactive-helpers.d.ts +5 -29
  81. package/dist/scripts/utils/interactive-helpers.d.ts.map +1 -1
  82. package/dist/scripts/utils/interactive-helpers.js +5 -89
  83. package/dist/scripts/utils/interactive-helpers.js.map +1 -1
  84. package/dist/scripts/utils/language-detector.d.ts.map +1 -1
  85. package/dist/scripts/utils/language-detector.js +4 -3
  86. package/dist/scripts/utils/language-detector.js.map +1 -1
  87. package/dist/scripts/utils/markdown-parser.d.ts +6 -52
  88. package/dist/scripts/utils/markdown-parser.d.ts.map +1 -1
  89. package/dist/scripts/utils/markdown-parser.js +5 -286
  90. package/dist/scripts/utils/markdown-parser.js.map +1 -1
  91. package/dist/scripts/utils/multi-repo-validator.d.ts +9 -10
  92. package/dist/scripts/utils/multi-repo-validator.d.ts.map +1 -1
  93. package/dist/scripts/utils/multi-repo-validator.js +15 -17
  94. package/dist/scripts/utils/multi-repo-validator.js.map +1 -1
  95. package/dist/scripts/utils/project-analyzer.d.ts +120 -0
  96. package/dist/scripts/utils/project-analyzer.d.ts.map +1 -0
  97. package/dist/scripts/utils/project-analyzer.js +358 -0
  98. package/dist/scripts/utils/project-analyzer.js.map +1 -0
  99. package/dist/scripts/utils/project-detector.d.ts.map +1 -1
  100. package/dist/scripts/utils/project-detector.js +6 -5
  101. package/dist/scripts/utils/project-detector.js.map +1 -1
  102. package/dist/scripts/utils/project-finder.d.ts +1 -21
  103. package/dist/scripts/utils/project-finder.d.ts.map +1 -1
  104. package/dist/scripts/utils/project-finder.js +2 -121
  105. package/dist/scripts/utils/project-finder.js.map +1 -1
  106. package/dist/scripts/utils/project-meta.d.ts +4 -27
  107. package/dist/scripts/utils/project-meta.d.ts.map +1 -1
  108. package/dist/scripts/utils/project-meta.js +3 -67
  109. package/dist/scripts/utils/project-meta.js.map +1 -1
  110. package/dist/scripts/utils/safe-file-reader.d.ts +84 -0
  111. package/dist/scripts/utils/safe-file-reader.d.ts.map +1 -0
  112. package/dist/scripts/utils/safe-file-reader.js +122 -0
  113. package/dist/scripts/utils/safe-file-reader.js.map +1 -0
  114. package/dist/scripts/utils/security-validator.d.ts +8 -19
  115. package/dist/scripts/utils/security-validator.d.ts.map +1 -1
  116. package/dist/scripts/utils/security-validator.js +28 -58
  117. package/dist/scripts/utils/security-validator.js.map +1 -1
  118. package/dist/scripts/utils/spec-archiver.d.ts.map +1 -1
  119. package/dist/scripts/utils/spec-archiver.js +7 -6
  120. package/dist/scripts/utils/spec-archiver.js.map +1 -1
  121. package/dist/scripts/utils/spec-updater.d.ts.map +1 -1
  122. package/dist/scripts/utils/spec-updater.js +10 -7
  123. package/dist/scripts/utils/spec-updater.js.map +1 -1
  124. package/dist/scripts/utils/tasks-converter.js +2 -2
  125. package/dist/scripts/utils/tasks-converter.js.map +1 -1
  126. package/dist/scripts/utils/tasks-format-validator.js +4 -4
  127. package/dist/scripts/utils/tasks-format-validator.js.map +1 -1
  128. package/dist/scripts/utils/template-applier.d.ts.map +1 -1
  129. package/dist/scripts/utils/template-applier.js +4 -3
  130. package/dist/scripts/utils/template-applier.js.map +1 -1
  131. package/dist/scripts/utils/types/validation.d.ts +57 -0
  132. package/dist/scripts/utils/types/validation.d.ts.map +1 -0
  133. package/dist/scripts/utils/types/validation.js +50 -0
  134. package/dist/scripts/utils/types/validation.js.map +1 -0
  135. package/dist/scripts/validate-phase.d.ts +6 -1
  136. package/dist/scripts/validate-phase.d.ts.map +1 -1
  137. package/dist/scripts/validate-phase.js +42 -20
  138. package/dist/scripts/validate-phase.js.map +1 -1
  139. package/dist/scripts/workflow-orchestrator.d.ts +4 -40
  140. package/dist/scripts/workflow-orchestrator.d.ts.map +1 -1
  141. package/dist/scripts/workflow-orchestrator.js +7 -194
  142. package/dist/scripts/workflow-orchestrator.js.map +1 -1
  143. package/dist/src/application/interfaces/config-provider.d.ts +89 -0
  144. package/dist/src/application/interfaces/config-provider.d.ts.map +1 -0
  145. package/dist/src/application/interfaces/config-provider.js +8 -0
  146. package/dist/src/application/interfaces/config-provider.js.map +1 -0
  147. package/dist/src/application/interfaces/external-api.d.ts +80 -0
  148. package/dist/src/application/interfaces/external-api.d.ts.map +1 -0
  149. package/dist/src/application/interfaces/external-api.js +8 -0
  150. package/dist/src/application/interfaces/external-api.js.map +1 -0
  151. package/dist/src/application/interfaces/spec-repository.d.ts +52 -0
  152. package/dist/src/application/interfaces/spec-repository.d.ts.map +1 -0
  153. package/dist/src/application/interfaces/spec-repository.js +8 -0
  154. package/dist/src/application/interfaces/spec-repository.js.map +1 -0
  155. package/dist/src/application/services/spec-service.d.ts +49 -0
  156. package/dist/src/application/services/spec-service.d.ts.map +1 -0
  157. package/dist/src/application/services/spec-service.js +94 -0
  158. package/dist/src/application/services/spec-service.js.map +1 -0
  159. package/dist/src/application/services/workflow-service.d.ts +58 -0
  160. package/dist/src/application/services/workflow-service.d.ts.map +1 -0
  161. package/dist/src/application/services/workflow-service.js +125 -0
  162. package/dist/src/application/services/workflow-service.js.map +1 -0
  163. package/dist/src/application/templates/processor.d.ts +31 -0
  164. package/dist/src/application/templates/processor.d.ts.map +1 -0
  165. package/dist/src/application/templates/processor.js +58 -0
  166. package/dist/src/application/templates/processor.js.map +1 -0
  167. package/dist/src/application/use-cases/spec/archive-spec.d.ts +34 -0
  168. package/dist/src/application/use-cases/spec/archive-spec.d.ts.map +1 -0
  169. package/dist/src/application/use-cases/spec/archive-spec.js +56 -0
  170. package/dist/src/application/use-cases/spec/archive-spec.js.map +1 -0
  171. package/dist/src/application/use-cases/spec/generate-design.d.ts +34 -0
  172. package/dist/src/application/use-cases/spec/generate-design.d.ts.map +1 -0
  173. package/dist/src/application/use-cases/spec/generate-design.js +58 -0
  174. package/dist/src/application/use-cases/spec/generate-design.js.map +1 -0
  175. package/dist/src/application/use-cases/spec/generate-requirements.d.ts +34 -0
  176. package/dist/src/application/use-cases/spec/generate-requirements.d.ts.map +1 -0
  177. package/dist/src/application/use-cases/spec/generate-requirements.js +58 -0
  178. package/dist/src/application/use-cases/spec/generate-requirements.js.map +1 -0
  179. package/dist/src/application/use-cases/spec/generate-tasks.d.ts +34 -0
  180. package/dist/src/application/use-cases/spec/generate-tasks.d.ts.map +1 -0
  181. package/dist/src/application/use-cases/spec/generate-tasks.js +58 -0
  182. package/dist/src/application/use-cases/spec/generate-tasks.js.map +1 -0
  183. package/dist/src/application/use-cases/spec/init-spec.d.ts +48 -0
  184. package/dist/src/application/use-cases/spec/init-spec.d.ts.map +1 -0
  185. package/dist/src/application/use-cases/spec/init-spec.js +121 -0
  186. package/dist/src/application/use-cases/spec/init-spec.js.map +1 -0
  187. package/dist/src/cli.d.ts +6 -7
  188. package/dist/src/cli.d.ts.map +1 -1
  189. package/dist/src/cli.js +6 -745
  190. package/dist/src/cli.js.map +1 -1
  191. package/dist/src/commands/config-validate.js +2 -2
  192. package/dist/src/commands/init.d.ts +6 -21
  193. package/dist/src/commands/init.d.ts.map +1 -1
  194. package/dist/src/commands/init.js +5 -508
  195. package/dist/src/commands/init.js.map +1 -1
  196. package/dist/src/commands/migrate.js +4 -3
  197. package/dist/src/commands/migrate.js.map +1 -1
  198. package/dist/src/commands/spec-archive.d.ts +6 -13
  199. package/dist/src/commands/spec-archive.d.ts.map +1 -1
  200. package/dist/src/commands/spec-archive.js +5 -36
  201. package/dist/src/commands/spec-archive.js.map +1 -1
  202. package/dist/src/commands/spec-list.d.ts +6 -11
  203. package/dist/src/commands/spec-list.d.ts.map +1 -1
  204. package/dist/src/commands/spec-list.js +5 -51
  205. package/dist/src/commands/spec-list.js.map +1 -1
  206. package/dist/src/domain/constants/approval.d.ts +18 -0
  207. package/dist/src/domain/constants/approval.d.ts.map +1 -0
  208. package/dist/src/domain/constants/approval.js +23 -0
  209. package/dist/src/domain/constants/approval.js.map +1 -0
  210. package/dist/src/domain/constants/environments.d.ts +33 -0
  211. package/dist/src/domain/constants/environments.d.ts.map +1 -0
  212. package/dist/src/domain/constants/environments.js +44 -0
  213. package/dist/src/domain/constants/environments.js.map +1 -0
  214. package/dist/src/domain/constants/index.d.ts +12 -0
  215. package/dist/src/domain/constants/index.d.ts.map +1 -0
  216. package/dist/src/domain/constants/index.js +18 -0
  217. package/dist/src/domain/constants/index.js.map +1 -0
  218. package/dist/src/domain/constants/languages.d.ts +23 -0
  219. package/dist/src/domain/constants/languages.d.ts.map +1 -0
  220. package/dist/src/domain/constants/languages.js +53 -0
  221. package/dist/src/domain/constants/languages.js.map +1 -0
  222. package/dist/src/domain/constants/phases.d.ts +32 -0
  223. package/dist/src/domain/constants/phases.d.ts.map +1 -0
  224. package/dist/src/domain/constants/phases.js +52 -0
  225. package/dist/src/domain/constants/phases.js.map +1 -0
  226. package/dist/src/domain/constants/test-commands.d.ts +36 -0
  227. package/dist/src/domain/constants/test-commands.d.ts.map +1 -0
  228. package/dist/src/domain/constants/test-commands.js +70 -0
  229. package/dist/src/domain/constants/test-commands.js.map +1 -0
  230. package/dist/src/domain/constants/validation-rules.d.ts +32 -0
  231. package/dist/src/domain/constants/validation-rules.d.ts.map +1 -0
  232. package/dist/src/domain/constants/validation-rules.js +51 -0
  233. package/dist/src/domain/constants/validation-rules.js.map +1 -0
  234. package/dist/src/domain/entities/spec.d.ts +66 -0
  235. package/dist/src/domain/entities/spec.d.ts.map +1 -0
  236. package/dist/src/domain/entities/spec.js +112 -0
  237. package/dist/src/domain/entities/spec.js.map +1 -0
  238. package/dist/src/domain/entities/task.d.ts +43 -0
  239. package/dist/src/domain/entities/task.d.ts.map +1 -0
  240. package/dist/src/domain/entities/task.js +65 -0
  241. package/dist/src/domain/entities/task.js.map +1 -0
  242. package/dist/src/domain/services/spec-validator.d.ts +46 -0
  243. package/dist/src/domain/services/spec-validator.d.ts.map +1 -0
  244. package/dist/src/domain/services/spec-validator.js +99 -0
  245. package/dist/src/domain/services/spec-validator.js.map +1 -0
  246. package/dist/src/domain/value-objects/feature-name.d.ts +24 -0
  247. package/dist/src/domain/value-objects/feature-name.d.ts.map +1 -0
  248. package/dist/src/domain/value-objects/feature-name.js +36 -0
  249. package/dist/src/domain/value-objects/feature-name.js.map +1 -0
  250. package/dist/src/domain/value-objects/index.d.ts +7 -0
  251. package/dist/src/domain/value-objects/index.d.ts.map +1 -0
  252. package/dist/src/domain/value-objects/index.js +7 -0
  253. package/dist/src/domain/value-objects/index.js.map +1 -0
  254. package/dist/src/infrastructure/config/index.d.ts +5 -0
  255. package/dist/src/infrastructure/config/index.d.ts.map +1 -0
  256. package/dist/src/infrastructure/config/index.js +6 -0
  257. package/dist/src/infrastructure/config/index.js.map +1 -0
  258. package/dist/src/infrastructure/config/schema.d.ts +337 -0
  259. package/dist/src/infrastructure/config/schema.d.ts.map +1 -0
  260. package/dist/src/infrastructure/config/schema.js +237 -0
  261. package/dist/src/infrastructure/config/schema.js.map +1 -0
  262. package/dist/src/infrastructure/external-apis/atlassian/confluence/approval.d.ts +14 -0
  263. package/dist/src/infrastructure/external-apis/atlassian/confluence/approval.d.ts.map +1 -0
  264. package/dist/src/infrastructure/external-apis/atlassian/confluence/approval.js +102 -0
  265. package/dist/src/infrastructure/external-apis/atlassian/confluence/approval.js.map +1 -0
  266. package/dist/src/infrastructure/external-apis/atlassian/confluence/client.d.ts +23 -0
  267. package/dist/src/infrastructure/external-apis/atlassian/confluence/client.d.ts.map +1 -0
  268. package/dist/src/infrastructure/external-apis/atlassian/confluence/client.js +192 -0
  269. package/dist/src/infrastructure/external-apis/atlassian/confluence/client.js.map +1 -0
  270. package/dist/src/infrastructure/external-apis/atlassian/confluence/hierarchy.d.ts +48 -0
  271. package/dist/src/infrastructure/external-apis/atlassian/confluence/hierarchy.d.ts.map +1 -0
  272. package/dist/src/infrastructure/external-apis/atlassian/confluence/hierarchy.js +531 -0
  273. package/dist/src/infrastructure/external-apis/atlassian/confluence/hierarchy.js.map +1 -0
  274. package/dist/src/infrastructure/external-apis/atlassian/confluence/index.d.ts +10 -0
  275. package/dist/src/infrastructure/external-apis/atlassian/confluence/index.d.ts.map +1 -0
  276. package/dist/src/infrastructure/external-apis/atlassian/confluence/index.js +12 -0
  277. package/dist/src/infrastructure/external-apis/atlassian/confluence/index.js.map +1 -0
  278. package/dist/src/infrastructure/external-apis/atlassian/confluence/sync-service.d.ts +13 -0
  279. package/dist/src/infrastructure/external-apis/atlassian/confluence/sync-service.d.ts.map +1 -0
  280. package/dist/src/infrastructure/external-apis/atlassian/confluence/sync-service.js +129 -0
  281. package/dist/src/infrastructure/external-apis/atlassian/confluence/sync-service.js.map +1 -0
  282. package/dist/src/infrastructure/external-apis/atlassian/confluence/types.d.ts +113 -0
  283. package/dist/src/infrastructure/external-apis/atlassian/confluence/types.d.ts.map +1 -0
  284. package/dist/src/infrastructure/external-apis/atlassian/confluence/types.js +5 -0
  285. package/dist/src/infrastructure/external-apis/atlassian/confluence/types.js.map +1 -0
  286. package/dist/src/infrastructure/external-apis/atlassian/jira/adf-converter.d.ts +15 -0
  287. package/dist/src/infrastructure/external-apis/atlassian/jira/adf-converter.d.ts.map +1 -0
  288. package/dist/src/infrastructure/external-apis/atlassian/jira/adf-converter.js +141 -0
  289. package/dist/src/infrastructure/external-apis/atlassian/jira/adf-converter.js.map +1 -0
  290. package/dist/src/infrastructure/external-apis/atlassian/jira/client.d.ts +50 -0
  291. package/dist/src/infrastructure/external-apis/atlassian/jira/client.d.ts.map +1 -0
  292. package/dist/src/infrastructure/external-apis/atlassian/jira/client.js +226 -0
  293. package/dist/src/infrastructure/external-apis/atlassian/jira/client.js.map +1 -0
  294. package/dist/src/infrastructure/external-apis/atlassian/jira/index.d.ts +12 -0
  295. package/dist/src/infrastructure/external-apis/atlassian/jira/index.d.ts.map +1 -0
  296. package/dist/src/infrastructure/external-apis/atlassian/jira/index.js +16 -0
  297. package/dist/src/infrastructure/external-apis/atlassian/jira/index.js.map +1 -0
  298. package/dist/src/infrastructure/external-apis/atlassian/jira/issue-builder.d.ts +49 -0
  299. package/dist/src/infrastructure/external-apis/atlassian/jira/issue-builder.d.ts.map +1 -0
  300. package/dist/src/infrastructure/external-apis/atlassian/jira/issue-builder.js +165 -0
  301. package/dist/src/infrastructure/external-apis/atlassian/jira/issue-builder.js.map +1 -0
  302. package/dist/src/infrastructure/external-apis/atlassian/jira/status-mapper.d.ts +14 -0
  303. package/dist/src/infrastructure/external-apis/atlassian/jira/status-mapper.d.ts.map +1 -0
  304. package/dist/src/infrastructure/external-apis/atlassian/jira/status-mapper.js +110 -0
  305. package/dist/src/infrastructure/external-apis/atlassian/jira/status-mapper.js.map +1 -0
  306. package/dist/src/infrastructure/external-apis/atlassian/jira/sync-service.d.ts +32 -0
  307. package/dist/src/infrastructure/external-apis/atlassian/jira/sync-service.d.ts.map +1 -0
  308. package/dist/src/infrastructure/external-apis/atlassian/jira/sync-service.js +284 -0
  309. package/dist/src/infrastructure/external-apis/atlassian/jira/sync-service.js.map +1 -0
  310. package/dist/src/infrastructure/external-apis/atlassian/jira/types.d.ts +114 -0
  311. package/dist/src/infrastructure/external-apis/atlassian/jira/types.d.ts.map +1 -0
  312. package/dist/src/infrastructure/external-apis/atlassian/jira/types.js +7 -0
  313. package/dist/src/infrastructure/external-apis/atlassian/jira/types.js.map +1 -0
  314. package/dist/src/infrastructure/external-apis/github/client.d.ts +25 -0
  315. package/dist/src/infrastructure/external-apis/github/client.d.ts.map +1 -0
  316. package/dist/src/infrastructure/external-apis/github/client.js +109 -0
  317. package/dist/src/infrastructure/external-apis/github/client.js.map +1 -0
  318. package/dist/src/infrastructure/external-apis/github/index.d.ts +7 -0
  319. package/dist/src/infrastructure/external-apis/github/index.d.ts.map +1 -0
  320. package/dist/src/infrastructure/external-apis/github/index.js +8 -0
  321. package/dist/src/infrastructure/external-apis/github/index.js.map +1 -0
  322. package/dist/src/infrastructure/external-apis/github/types.d.ts +69 -0
  323. package/dist/src/infrastructure/external-apis/github/types.d.ts.map +1 -0
  324. package/dist/src/infrastructure/external-apis/github/types.js +5 -0
  325. package/dist/src/infrastructure/external-apis/github/types.js.map +1 -0
  326. package/dist/src/infrastructure/external-apis/github/utils.d.ts +18 -0
  327. package/dist/src/infrastructure/external-apis/github/utils.d.ts.map +1 -0
  328. package/dist/src/infrastructure/external-apis/github/utils.js +84 -0
  329. package/dist/src/infrastructure/external-apis/github/utils.js.map +1 -0
  330. package/dist/src/infrastructure/filesystem/index.d.ts +6 -0
  331. package/dist/src/infrastructure/filesystem/index.d.ts.map +1 -0
  332. package/dist/src/infrastructure/filesystem/index.js +5 -0
  333. package/dist/src/infrastructure/filesystem/index.js.map +1 -0
  334. package/dist/src/infrastructure/filesystem/project-meta.d.ts +32 -0
  335. package/dist/src/infrastructure/filesystem/project-meta.d.ts.map +1 -0
  336. package/dist/src/infrastructure/filesystem/project-meta.js +75 -0
  337. package/dist/src/infrastructure/filesystem/project-meta.js.map +1 -0
  338. package/dist/src/infrastructure/parsers/aidlc-parser.d.ts +86 -0
  339. package/dist/src/infrastructure/parsers/aidlc-parser.d.ts.map +1 -0
  340. package/dist/src/infrastructure/parsers/aidlc-parser.js +208 -0
  341. package/dist/src/infrastructure/parsers/aidlc-parser.js.map +1 -0
  342. package/dist/src/infrastructure/parsers/index.d.ts +8 -0
  343. package/dist/src/infrastructure/parsers/index.d.ts.map +1 -0
  344. package/dist/src/infrastructure/parsers/index.js +6 -0
  345. package/dist/src/infrastructure/parsers/index.js.map +1 -0
  346. package/dist/src/infrastructure/parsers/markdown-parser.d.ts +51 -0
  347. package/dist/src/infrastructure/parsers/markdown-parser.d.ts.map +1 -0
  348. package/dist/src/infrastructure/parsers/markdown-parser.js +253 -0
  349. package/dist/src/infrastructure/parsers/markdown-parser.js.map +1 -0
  350. package/dist/src/presentation/cli/config.d.ts +12 -0
  351. package/dist/src/presentation/cli/config.d.ts.map +1 -0
  352. package/dist/src/presentation/cli/config.js +22 -0
  353. package/dist/src/presentation/cli/config.js.map +1 -0
  354. package/dist/src/presentation/cli/version.d.ts +10 -0
  355. package/dist/src/presentation/cli/version.d.ts.map +1 -0
  356. package/dist/src/presentation/cli/version.js +41 -0
  357. package/dist/src/presentation/cli/version.js.map +1 -0
  358. package/dist/src/presentation/cli.d.ts +22 -0
  359. package/dist/src/presentation/cli.d.ts.map +1 -0
  360. package/dist/src/presentation/cli.js +85 -0
  361. package/dist/src/presentation/cli.js.map +1 -0
  362. package/dist/src/presentation/commands/config/register.d.ts +11 -0
  363. package/dist/src/presentation/commands/config/register.d.ts.map +1 -0
  364. package/dist/src/presentation/commands/config/register.js +44 -0
  365. package/dist/src/presentation/commands/config/register.js.map +1 -0
  366. package/dist/src/presentation/commands/confluence/register.d.ts +11 -0
  367. package/dist/src/presentation/commands/confluence/register.d.ts.map +1 -0
  368. package/dist/src/presentation/commands/confluence/register.js +32 -0
  369. package/dist/src/presentation/commands/confluence/register.js.map +1 -0
  370. package/dist/src/presentation/commands/confluence/sync.d.ts +17 -0
  371. package/dist/src/presentation/commands/confluence/sync.d.ts.map +1 -0
  372. package/dist/src/presentation/commands/confluence/sync.js +25 -0
  373. package/dist/src/presentation/commands/confluence/sync.js.map +1 -0
  374. package/dist/src/presentation/commands/init/handler.d.ts +10 -0
  375. package/dist/src/presentation/commands/init/handler.d.ts.map +1 -0
  376. package/dist/src/presentation/commands/init/handler.js +64 -0
  377. package/dist/src/presentation/commands/init/handler.js.map +1 -0
  378. package/dist/src/presentation/commands/init/prompts.d.ts +41 -0
  379. package/dist/src/presentation/commands/init/prompts.d.ts.map +1 -0
  380. package/dist/src/presentation/commands/init/prompts.js +119 -0
  381. package/dist/src/presentation/commands/init/prompts.js.map +1 -0
  382. package/dist/src/presentation/commands/init/register.d.ts +11 -0
  383. package/dist/src/presentation/commands/init/register.d.ts.map +1 -0
  384. package/dist/src/presentation/commands/init/register.js +141 -0
  385. package/dist/src/presentation/commands/init/register.js.map +1 -0
  386. package/dist/src/presentation/commands/init/setup.d.ts +26 -0
  387. package/dist/src/presentation/commands/init/setup.d.ts.map +1 -0
  388. package/dist/src/presentation/commands/init/setup.js +196 -0
  389. package/dist/src/presentation/commands/init/setup.js.map +1 -0
  390. package/dist/src/presentation/commands/init/templates.d.ts +19 -0
  391. package/dist/src/presentation/commands/init/templates.d.ts.map +1 -0
  392. package/dist/src/presentation/commands/init/templates.js +140 -0
  393. package/dist/src/presentation/commands/init/templates.js.map +1 -0
  394. package/dist/src/presentation/commands/init/validation.d.ts +21 -0
  395. package/dist/src/presentation/commands/init/validation.d.ts.map +1 -0
  396. package/dist/src/presentation/commands/init/validation.js +65 -0
  397. package/dist/src/presentation/commands/init/validation.js.map +1 -0
  398. package/dist/src/presentation/commands/jira/register.d.ts +11 -0
  399. package/dist/src/presentation/commands/jira/register.d.ts.map +1 -0
  400. package/dist/src/presentation/commands/jira/register.js +75 -0
  401. package/dist/src/presentation/commands/jira/register.js.map +1 -0
  402. package/dist/src/presentation/commands/jira/sync.d.ts +29 -0
  403. package/dist/src/presentation/commands/jira/sync.d.ts.map +1 -0
  404. package/dist/src/presentation/commands/jira/sync.js +37 -0
  405. package/dist/src/presentation/commands/jira/sync.js.map +1 -0
  406. package/dist/src/{commands/multi-repo-add-repo.d.ts → presentation/commands/multi-repo/add-repo.d.ts} +1 -1
  407. package/dist/src/presentation/commands/multi-repo/add-repo.d.ts.map +1 -0
  408. package/dist/src/{commands/multi-repo-add-repo.js → presentation/commands/multi-repo/add-repo.js} +4 -4
  409. package/dist/src/presentation/commands/multi-repo/add-repo.js.map +1 -0
  410. package/dist/src/{commands/multi-repo-ci-status.d.ts → presentation/commands/multi-repo/ci-status.d.ts} +2 -2
  411. package/dist/src/presentation/commands/multi-repo/ci-status.d.ts.map +1 -0
  412. package/dist/src/{commands/multi-repo-ci-status.js → presentation/commands/multi-repo/ci-status.js} +95 -81
  413. package/dist/src/presentation/commands/multi-repo/ci-status.js.map +1 -0
  414. package/dist/src/{commands/multi-repo-confluence-sync.d.ts → presentation/commands/multi-repo/confluence-sync.d.ts} +1 -1
  415. package/dist/src/presentation/commands/multi-repo/confluence-sync.d.ts.map +1 -0
  416. package/dist/src/{commands/multi-repo-confluence-sync.js → presentation/commands/multi-repo/confluence-sync.js} +7 -6
  417. package/dist/src/presentation/commands/multi-repo/confluence-sync.js.map +1 -0
  418. package/dist/src/{commands/multi-repo-init.d.ts → presentation/commands/multi-repo/init.d.ts} +1 -1
  419. package/dist/src/presentation/commands/multi-repo/init.d.ts.map +1 -0
  420. package/dist/src/{commands/multi-repo-init.js → presentation/commands/multi-repo/init.js} +6 -6
  421. package/dist/src/presentation/commands/multi-repo/init.js.map +1 -0
  422. package/dist/src/{commands/multi-repo-list.d.ts → presentation/commands/multi-repo/list.d.ts} +1 -1
  423. package/dist/src/presentation/commands/multi-repo/list.d.ts.map +1 -0
  424. package/dist/src/{commands/multi-repo-list.js → presentation/commands/multi-repo/list.js} +2 -2
  425. package/dist/src/presentation/commands/multi-repo/list.js.map +1 -0
  426. package/dist/src/presentation/commands/multi-repo/register.d.ts +12 -0
  427. package/dist/src/presentation/commands/multi-repo/register.d.ts.map +1 -0
  428. package/dist/src/presentation/commands/multi-repo/register.js +249 -0
  429. package/dist/src/presentation/commands/multi-repo/register.js.map +1 -0
  430. package/dist/src/{commands/multi-repo-test.d.ts → presentation/commands/multi-repo/test.d.ts} +1 -1
  431. package/dist/src/presentation/commands/multi-repo/test.d.ts.map +1 -0
  432. package/dist/src/{commands/multi-repo-test.js → presentation/commands/multi-repo/test.js} +4 -4
  433. package/dist/src/presentation/commands/multi-repo/test.js.map +1 -0
  434. package/dist/src/presentation/commands/phase/register.d.ts +11 -0
  435. package/dist/src/presentation/commands/phase/register.d.ts.map +1 -0
  436. package/dist/src/presentation/commands/phase/register.js +97 -0
  437. package/dist/src/presentation/commands/phase/register.js.map +1 -0
  438. package/dist/src/presentation/commands/spec/archive.d.ts +17 -0
  439. package/dist/src/presentation/commands/spec/archive.d.ts.map +1 -0
  440. package/dist/src/presentation/commands/spec/archive.js +40 -0
  441. package/dist/src/presentation/commands/spec/archive.js.map +1 -0
  442. package/dist/src/presentation/commands/spec/list.d.ts +15 -0
  443. package/dist/src/presentation/commands/spec/list.d.ts.map +1 -0
  444. package/dist/src/presentation/commands/spec/list.js +55 -0
  445. package/dist/src/presentation/commands/spec/list.js.map +1 -0
  446. package/dist/src/presentation/commands/spec/register.d.ts +11 -0
  447. package/dist/src/presentation/commands/spec/register.d.ts.map +1 -0
  448. package/dist/src/presentation/commands/spec/register.js +45 -0
  449. package/dist/src/presentation/commands/spec/register.js.map +1 -0
  450. package/dist/src/presentation/commands/workflow/orchestrator.d.ts +50 -0
  451. package/dist/src/presentation/commands/workflow/orchestrator.d.ts.map +1 -0
  452. package/dist/src/presentation/commands/workflow/orchestrator.js +174 -0
  453. package/dist/src/presentation/commands/workflow/orchestrator.js.map +1 -0
  454. package/dist/src/presentation/commands/workflow/register.d.ts +11 -0
  455. package/dist/src/presentation/commands/workflow/register.d.ts.map +1 -0
  456. package/dist/src/presentation/commands/workflow/register.js +58 -0
  457. package/dist/src/presentation/commands/workflow/register.js.map +1 -0
  458. package/dist/src/presentation/formatters/error-formatter.d.ts +79 -0
  459. package/dist/src/presentation/formatters/error-formatter.d.ts.map +1 -0
  460. package/dist/src/presentation/formatters/error-formatter.js +150 -0
  461. package/dist/src/presentation/formatters/error-formatter.js.map +1 -0
  462. package/dist/src/presentation/formatters/index.d.ts +8 -0
  463. package/dist/src/presentation/formatters/index.d.ts.map +1 -0
  464. package/dist/src/presentation/formatters/index.js +11 -0
  465. package/dist/src/presentation/formatters/index.js.map +1 -0
  466. package/dist/src/presentation/formatters/output-formatter.d.ts +98 -0
  467. package/dist/src/presentation/formatters/output-formatter.d.ts.map +1 -0
  468. package/dist/src/presentation/formatters/output-formatter.js +165 -0
  469. package/dist/src/presentation/formatters/output-formatter.js.map +1 -0
  470. package/dist/src/presentation/formatters/progress-formatter.d.ts +121 -0
  471. package/dist/src/presentation/formatters/progress-formatter.d.ts.map +1 -0
  472. package/dist/src/presentation/formatters/progress-formatter.js +235 -0
  473. package/dist/src/presentation/formatters/progress-formatter.js.map +1 -0
  474. package/dist/src/presentation/interactive/confirmation.d.ts +24 -0
  475. package/dist/src/presentation/interactive/confirmation.d.ts.map +1 -0
  476. package/dist/src/presentation/interactive/confirmation.js +54 -0
  477. package/dist/src/presentation/interactive/confirmation.js.map +1 -0
  478. package/dist/src/presentation/interactive/index.d.ts +8 -0
  479. package/dist/src/presentation/interactive/index.d.ts.map +1 -0
  480. package/dist/src/presentation/interactive/index.js +11 -0
  481. package/dist/src/presentation/interactive/index.js.map +1 -0
  482. package/dist/src/presentation/interactive/prompts.d.ts +31 -0
  483. package/dist/src/presentation/interactive/prompts.d.ts.map +1 -0
  484. package/dist/src/presentation/interactive/prompts.js +71 -0
  485. package/dist/src/presentation/interactive/prompts.js.map +1 -0
  486. package/dist/src/presentation/interactive/selection.d.ts +31 -0
  487. package/dist/src/presentation/interactive/selection.d.ts.map +1 -0
  488. package/dist/src/presentation/interactive/selection.js +138 -0
  489. package/dist/src/presentation/interactive/selection.js.map +1 -0
  490. package/dist/src/shared/types/errors.d.ts +132 -0
  491. package/dist/src/shared/types/errors.d.ts.map +1 -0
  492. package/dist/src/shared/types/errors.js +61 -0
  493. package/dist/src/shared/types/errors.js.map +1 -0
  494. package/dist/src/shared/types/result.d.ts +53 -0
  495. package/dist/src/shared/types/result.d.ts.map +1 -0
  496. package/dist/src/shared/types/result.js +42 -0
  497. package/dist/src/shared/types/result.js.map +1 -0
  498. package/dist/test-confluence-auth.d.ts +6 -0
  499. package/dist/test-confluence-auth.d.ts.map +1 -0
  500. package/dist/test-confluence-auth.js +128 -0
  501. package/dist/test-confluence-auth.js.map +1 -0
  502. package/docs/MIGRATION.md +513 -0
  503. package/docs/architecture.md +774 -0
  504. package/docs/guides/comprehensive-verification-guide.md +1926 -0
  505. package/docs/onion-architecture-phase0-complete.md +91 -0
  506. package/package.json +6 -6
  507. package/scripts/README.md +148 -0
  508. package/scripts/__tests__/jira-transitions.test.ts +44 -30
  509. package/scripts/__tests__/mermaid-converter.test.ts +2 -2
  510. package/scripts/__tests__/multi-repo-validator.test.ts +62 -62
  511. package/scripts/__tests__/spec-archiver.test.ts +12 -0
  512. package/scripts/__tests__/validate-phase.test.ts +6 -6
  513. package/scripts/build/README.md +24 -0
  514. package/scripts/{copy-static-assets.js → build/copy-static-assets.js} +1 -1
  515. package/scripts/{set-permissions.js → build/set-permissions.js} +1 -1
  516. package/scripts/config/config-schema.ts +43 -302
  517. package/scripts/config-global.ts +3 -2
  518. package/scripts/confluence-sync.ts +17 -538
  519. package/scripts/constants/environments.ts +3 -53
  520. package/scripts/constants/languages.ts +3 -68
  521. package/scripts/constants/test-commands.ts +3 -94
  522. package/scripts/dev-tools/README.md +22 -0
  523. package/scripts/{test-interactive.ts → dev-tools/test-interactive.ts} +4 -3
  524. package/scripts/github-actions-client.ts +18 -256
  525. package/scripts/jira-sync.ts +5 -1270
  526. package/scripts/markdown-to-confluence.ts +5 -5
  527. package/scripts/multi-project-estimate.ts +3 -2
  528. package/scripts/phase-runner.ts +41 -19
  529. package/scripts/pre-flight-check.ts +27 -11
  530. package/scripts/template/__tests__/multi-repo-renderer.test.ts +12 -0
  531. package/scripts/template/multi-repo-renderer.ts +2 -2
  532. package/scripts/test-execution-generator.ts +5 -4
  533. package/scripts/utils/__tests__/config-validator.test.ts +19 -19
  534. package/scripts/utils/__tests__/feature-name-validator.test.ts +13 -13
  535. package/scripts/utils/__tests__/multi-repo-validator.test.ts +34 -34
  536. package/scripts/utils/__tests__/project-analyzer.test.ts +542 -0
  537. package/scripts/utils/__tests__/safe-file-reader.test.ts +208 -0
  538. package/scripts/utils/__tests__/security-validator.test.ts +33 -33
  539. package/scripts/utils/__tests__/validation-result.test.ts +112 -0
  540. package/scripts/utils/aidlc-parser.ts +18 -287
  541. package/scripts/utils/ci-generator.ts +4 -3
  542. package/scripts/utils/config-loader.ts +54 -50
  543. package/scripts/utils/config-validator.ts +89 -80
  544. package/scripts/utils/docker-requirement-detector.ts +5 -4
  545. package/scripts/utils/env-config.ts +59 -40
  546. package/scripts/utils/feature-name-validator.ts +25 -40
  547. package/scripts/utils/interactive-helpers.ts +24 -132
  548. package/scripts/utils/language-detector.ts +4 -3
  549. package/scripts/utils/markdown-parser.ts +18 -373
  550. package/scripts/utils/multi-repo-validator.ts +27 -28
  551. package/scripts/utils/project-analyzer.ts +429 -0
  552. package/scripts/utils/project-detector.ts +6 -5
  553. package/scripts/utils/project-finder.ts +2 -154
  554. package/scripts/utils/project-meta.ts +8 -91
  555. package/scripts/utils/safe-file-reader.ts +158 -0
  556. package/scripts/utils/security-validator.ts +42 -78
  557. package/scripts/utils/spec-archiver.ts +7 -6
  558. package/scripts/utils/spec-updater.ts +12 -6
  559. package/scripts/utils/tasks-converter.ts +2 -2
  560. package/scripts/utils/tasks-format-validator.ts +4 -4
  561. package/scripts/utils/template-applier.ts +4 -3
  562. package/scripts/utils/types/validation.ts +92 -0
  563. package/scripts/validate-phase.ts +51 -23
  564. package/scripts/workflow-orchestrator.ts +16 -251
  565. package/dist/scripts/mermaid-converter.d.ts.map +0 -1
  566. package/dist/scripts/mermaid-converter.js.map +0 -1
  567. package/dist/scripts/resource-dashboard.d.ts +0 -7
  568. package/dist/scripts/resource-dashboard.d.ts.map +0 -1
  569. package/dist/scripts/resource-dashboard.js +0 -157
  570. package/dist/scripts/resource-dashboard.js.map +0 -1
  571. package/dist/scripts/test-interactive.d.ts.map +0 -1
  572. package/dist/scripts/test-interactive.js.map +0 -1
  573. package/dist/scripts/test-new-features.d.ts +0 -5
  574. package/dist/scripts/test-new-features.d.ts.map +0 -1
  575. package/dist/scripts/test-new-features.js +0 -148
  576. package/dist/scripts/test-new-features.js.map +0 -1
  577. package/dist/scripts/test-spec-generator.d.ts +0 -29
  578. package/dist/scripts/test-spec-generator.d.ts.map +0 -1
  579. package/dist/scripts/test-spec-generator.js +0 -493
  580. package/dist/scripts/test-spec-generator.js.map +0 -1
  581. package/dist/scripts/utils/confluence-approval.d.ts +0 -46
  582. package/dist/scripts/utils/confluence-approval.d.ts.map +0 -1
  583. package/dist/scripts/utils/confluence-approval.js +0 -120
  584. package/dist/scripts/utils/confluence-approval.js.map +0 -1
  585. package/dist/scripts/utils/template-finder.d.ts +0 -37
  586. package/dist/scripts/utils/template-finder.d.ts.map +0 -1
  587. package/dist/scripts/utils/template-finder.js +0 -58
  588. package/dist/scripts/utils/template-finder.js.map +0 -1
  589. package/dist/src/commands/multi-repo-add-repo.d.ts.map +0 -1
  590. package/dist/src/commands/multi-repo-add-repo.js.map +0 -1
  591. package/dist/src/commands/multi-repo-ci-status.d.ts.map +0 -1
  592. package/dist/src/commands/multi-repo-ci-status.js.map +0 -1
  593. package/dist/src/commands/multi-repo-confluence-sync.d.ts.map +0 -1
  594. package/dist/src/commands/multi-repo-confluence-sync.js.map +0 -1
  595. package/dist/src/commands/multi-repo-init.d.ts.map +0 -1
  596. package/dist/src/commands/multi-repo-init.js.map +0 -1
  597. package/dist/src/commands/multi-repo-list.d.ts.map +0 -1
  598. package/dist/src/commands/multi-repo-list.js.map +0 -1
  599. package/dist/src/commands/multi-repo-test.d.ts.map +0 -1
  600. package/dist/src/commands/multi-repo-test.js.map +0 -1
  601. package/dist/src/commands/setup-existing.d.ts +0 -22
  602. package/dist/src/commands/setup-existing.d.ts.map +0 -1
  603. package/dist/src/commands/setup-existing.js +0 -606
  604. package/dist/src/commands/setup-existing.js.map +0 -1
  605. package/scripts/__tests__/setup-existing-project.test.ts +0 -244
  606. package/scripts/resource-dashboard.ts +0 -189
  607. package/scripts/test-new-features.ts +0 -171
  608. package/scripts/test-spec-generator.ts +0 -570
  609. package/scripts/utils/confluence-approval.ts +0 -169
  610. package/scripts/utils/template-finder.ts +0 -69
  611. /package/dist/scripts/{mermaid-converter.d.ts → dev-tools/mermaid-converter.d.ts} +0 -0
  612. /package/dist/scripts/{mermaid-converter.js → dev-tools/mermaid-converter.js} +0 -0
  613. /package/dist/scripts/{test-interactive.d.ts → dev-tools/test-interactive.d.ts} +0 -0
  614. /package/scripts/{mermaid-converter.ts → dev-tools/mermaid-converter.ts} +0 -0
@@ -2,7 +2,7 @@
2
2
  * 設定ファイルのバリデーション
3
3
  */
4
4
 
5
- import { existsSync, readFileSync } from 'fs';
5
+ import { existsSync } from 'fs';
6
6
  import { AppConfigSchema } from '../config/config-schema.js';
7
7
  import type { ZodIssue } from 'zod';
8
8
  import { getConfig, getConfigPath, getGlobalConfigPath } from './config-loader.js';
@@ -14,23 +14,51 @@ import {
14
14
  filterStoryTypes,
15
15
  filterSubtaskTypes,
16
16
  } from './jira-issue-type-fetcher.js';
17
+ import type { Result } from './types/validation.js';
18
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
19
+ import { success, failure } from './types/validation.js';
20
+ import { safeReadFileOrThrow } from './safe-file-reader.js';
17
21
 
18
22
  /**
19
- * バリデーション結果
23
+ * Result型を拡張した情報メッセージ付きバリデーション結果
24
+ * config-validator固有の拡張型
20
25
  */
21
- export interface ValidationResult {
22
- valid: boolean;
23
- errors: string[];
24
- warnings: string[];
26
+ export interface ResultWithInfo extends Result<boolean, string> {
25
27
  info: string[];
26
28
  }
27
29
 
30
+ /**
31
+ * ResultWithInfo を作成するヘルパー関数(成功)
32
+ */
33
+ function successWithInfo(value: boolean, warnings: string[] = [], info: string[] = []): ResultWithInfo {
34
+ return {
35
+ success: true,
36
+ value,
37
+ errors: [],
38
+ warnings,
39
+ info,
40
+ };
41
+ }
42
+
43
+ /**
44
+ * ResultWithInfo を作成するヘルパー関数(失敗)
45
+ */
46
+ function failureWithInfo(errors: string[], warnings: string[] = [], info: string[] = []): ResultWithInfo {
47
+ return {
48
+ success: false,
49
+ value: undefined,
50
+ errors,
51
+ warnings,
52
+ info,
53
+ };
54
+ }
55
+
28
56
  /**
29
57
  * プロジェクト設定ファイルをバリデーション
30
58
  */
31
59
  export function validateProjectConfig(
32
60
  projectRoot: string = process.cwd(),
33
- ): ValidationResult {
61
+ ): ResultWithInfo {
34
62
  const errors: string[] = [];
35
63
  const warnings: string[] = [];
36
64
  const info: string[] = [];
@@ -40,16 +68,11 @@ export function validateProjectConfig(
40
68
  if (!existsSync(configPath)) {
41
69
  // 設定ファイルが存在しない場合は情報メッセージ(デフォルト設定を使用)
42
70
  info.push('Project config file not found. Using default configuration.');
43
- return {
44
- valid: true,
45
- errors: [],
46
- warnings: [],
47
- info,
48
- };
71
+ return successWithInfo(true, [], info);
49
72
  }
50
73
 
51
74
  try {
52
- const content = readFileSync(configPath, 'utf-8');
75
+ const content = safeReadFileOrThrow(configPath);
53
76
  const parsed = JSON.parse(content);
54
77
 
55
78
  // スキーマでバリデーション
@@ -61,12 +84,7 @@ export function validateProjectConfig(
61
84
  errors.push(`${path}: ${error.message}`);
62
85
  });
63
86
 
64
- return {
65
- valid: false,
66
- errors,
67
- warnings: [],
68
- info: [],
69
- };
87
+ return failureWithInfo(errors, [], []);
70
88
  }
71
89
 
72
90
  // 追加のバリデーション
@@ -171,12 +189,11 @@ export function validateProjectConfig(
171
189
  }
172
190
  }
173
191
 
174
- return {
175
- valid: errors.length === 0,
176
- errors,
177
- warnings,
178
- info: [],
179
- };
192
+ if (errors.length > 0) {
193
+ return failureWithInfo(errors, warnings, []);
194
+ }
195
+
196
+ return successWithInfo(true, warnings, []);
180
197
  } catch (error) {
181
198
  if (error instanceof SyntaxError) {
182
199
  errors.push(`Invalid JSON: ${error.message}`);
@@ -186,12 +203,7 @@ export function validateProjectConfig(
186
203
  );
187
204
  }
188
205
 
189
- return {
190
- valid: false,
191
- errors,
192
- warnings: [],
193
- info: [],
194
- };
206
+ return failureWithInfo(errors, [], []);
195
207
  }
196
208
  }
197
209
 
@@ -225,11 +237,11 @@ export function validateAndReport(
225
237
  return false;
226
238
  }
227
239
 
228
- if (result.valid) {
240
+ if (result.success) {
229
241
  console.log('✅ Configuration is valid');
230
242
  }
231
243
 
232
- return result.valid;
244
+ return result.success;
233
245
  }
234
246
 
235
247
  /**
@@ -241,7 +253,7 @@ export function validateAndReport(
241
253
  export function validateForConfluenceSync(
242
254
  docType: 'requirements' | 'design' | 'tasks',
243
255
  projectRoot: string = process.cwd(),
244
- ): ValidationResult {
256
+ ): ResultWithInfo {
245
257
  const errors: string[] = [];
246
258
  const warnings: string[] = [];
247
259
  const info: string[] = [];
@@ -319,12 +331,11 @@ export function validateForConfluenceSync(
319
331
  }
320
332
  }
321
333
 
322
- return {
323
- valid: errors.length === 0,
324
- errors,
325
- warnings,
326
- info,
327
- };
334
+ if (errors.length > 0) {
335
+ return failureWithInfo(errors, warnings, info);
336
+ }
337
+
338
+ return successWithInfo(true, warnings, info);
328
339
  }
329
340
 
330
341
  /**
@@ -334,7 +345,7 @@ export function validateForConfluenceSync(
334
345
  */
335
346
  export function validateForJiraSync(
336
347
  projectRoot: string = process.cwd(),
337
- ): ValidationResult {
348
+ ): ResultWithInfo {
338
349
  const errors: string[] = [];
339
350
  const warnings: string[] = [];
340
351
  const info: string[] = [];
@@ -419,12 +430,11 @@ export function validateForJiraSync(
419
430
  }
420
431
  }
421
432
 
422
- return {
423
- valid: errors.length === 0,
424
- errors,
425
- warnings,
426
- info,
427
- };
433
+ if (errors.length > 0) {
434
+ return failureWithInfo(errors, warnings, info);
435
+ }
436
+
437
+ return successWithInfo(true, warnings, info);
428
438
  }
429
439
 
430
440
  /**
@@ -434,10 +444,14 @@ export function validateForJiraSync(
434
444
  */
435
445
  export async function validateForJiraSyncAsync(
436
446
  projectRoot: string = process.cwd(),
437
- ): Promise<ValidationResult> {
447
+ ): Promise<ResultWithInfo> {
438
448
  // まず同期版のバリデーションを実行
439
449
  const result = validateForJiraSync(projectRoot);
440
450
 
451
+ // 追加のエラーと警告を収集
452
+ const additionalErrors: string[] = [];
453
+ const additionalWarnings: string[] = [];
454
+
441
455
  // JIRA認証情報とプロジェクトキーが設定されている場合、Issue Type IDの存在チェックを実行
442
456
  if (hasJiraCredentials()) {
443
457
  try {
@@ -467,7 +481,7 @@ export async function validateForJiraSyncAsync(
467
481
  .join('\n')
468
482
  : ' (Storyタイプが見つかりませんでした)';
469
483
 
470
- result.errors.push(
484
+ additionalErrors.push(
471
485
  `設定されたStory Issue Type ID (${storyId}) がプロジェクト '${projectKey}' に存在しません。\n` +
472
486
  '\n利用可能なStoryタイプ:\n' +
473
487
  suggestions +
@@ -478,7 +492,6 @@ export async function validateForJiraSyncAsync(
478
492
  ' 2. または、対話的設定を再実行:\n' +
479
493
  ' npm run setup:interactive',
480
494
  );
481
- result.valid = false;
482
495
  }
483
496
  }
484
497
 
@@ -493,7 +506,7 @@ export async function validateForJiraSyncAsync(
493
506
  .join('\n')
494
507
  : ' (Subtaskタイプが見つかりませんでした)';
495
508
 
496
- result.warnings.push(
509
+ additionalWarnings.push(
497
510
  `設定されたSubtask Issue Type ID (${subtaskId}) がプロジェクト '${projectKey}' に存在しません。\n` +
498
511
  '\n利用可能なSubtaskタイプ:\n' +
499
512
  suggestions +
@@ -509,7 +522,7 @@ export async function validateForJiraSyncAsync(
509
522
  } else {
510
523
  // Issue Types取得に失敗した場合(認証エラー、ネットワークエラーなど)
511
524
  // エラーにはしないが、警告として記録
512
- result.warnings.push(
525
+ additionalWarnings.push(
513
526
  `JIRAプロジェクト '${projectKey}' のIssue Typesを取得できませんでした。` +
514
527
  '設定されたIssue Type IDの存在確認をスキップします。',
515
528
  );
@@ -518,20 +531,32 @@ export async function validateForJiraSyncAsync(
518
531
  } catch (error) {
519
532
  // プロジェクトメタデータの読み込みに失敗した場合など
520
533
  // エラーにはしないが、警告として記録
521
- result.warnings.push(
534
+ additionalWarnings.push(
522
535
  `プロジェクトメタデータの読み込みに失敗しました: ${error instanceof Error ? error.message : error}` +
523
536
  '設定されたIssue Type IDの存在確認をスキップします。',
524
537
  );
525
538
  }
526
539
  }
527
540
 
541
+ // 追加のエラーや警告があれば、新しいResultWithInfoを作成
542
+ if (additionalErrors.length > 0 || additionalWarnings.length > 0) {
543
+ const allErrors = [...result.errors, ...additionalErrors];
544
+ const allWarnings = [...result.warnings, ...additionalWarnings];
545
+
546
+ if (allErrors.length > 0) {
547
+ return failureWithInfo(allErrors, allWarnings, result.info);
548
+ }
549
+
550
+ return successWithInfo(true, allWarnings, result.info);
551
+ }
552
+
528
553
  return result;
529
554
  }
530
555
 
531
556
  /**
532
557
  * グローバル設定ファイルをバリデーション
533
558
  */
534
- export function validateGlobalConfig(): ValidationResult {
559
+ export function validateGlobalConfig(): ResultWithInfo {
535
560
  const errors: string[] = [];
536
561
  const warnings: string[] = [];
537
562
  const info: string[] = [];
@@ -540,16 +565,11 @@ export function validateGlobalConfig(): ValidationResult {
540
565
 
541
566
  if (!existsSync(globalConfigPath)) {
542
567
  info.push('Global config file not found. This is optional.');
543
- return {
544
- valid: true,
545
- errors: [],
546
- warnings: [],
547
- info,
548
- };
568
+ return successWithInfo(true, [], info);
549
569
  }
550
570
 
551
571
  try {
552
- const content = readFileSync(globalConfigPath, 'utf-8');
572
+ const content = safeReadFileOrThrow(globalConfigPath);
553
573
  const parsed = JSON.parse(content);
554
574
 
555
575
  // スキーマでバリデーション
@@ -561,20 +581,14 @@ export function validateGlobalConfig(): ValidationResult {
561
581
  errors.push(`${path}: ${error.message}`);
562
582
  });
563
583
 
564
- return {
565
- valid: false,
566
- errors,
567
- warnings: [],
568
- info: [],
569
- };
584
+ return failureWithInfo(errors, [], []);
585
+ }
586
+
587
+ if (errors.length > 0) {
588
+ return failureWithInfo(errors, warnings, []);
570
589
  }
571
590
 
572
- return {
573
- valid: errors.length === 0,
574
- errors,
575
- warnings,
576
- info: [],
577
- };
591
+ return successWithInfo(true, warnings, []);
578
592
  } catch (error) {
579
593
  if (error instanceof SyntaxError) {
580
594
  errors.push(`Invalid JSON in global config: ${error.message}`);
@@ -584,12 +598,7 @@ export function validateGlobalConfig(): ValidationResult {
584
598
  );
585
599
  }
586
600
 
587
- return {
588
- valid: false,
589
- errors,
590
- warnings: [],
591
- info: [],
592
- };
601
+ return failureWithInfo(errors, [], []);
593
602
  }
594
603
  }
595
604
 
@@ -3,7 +3,8 @@
3
3
  * design.md、requirements.md、test-type-selectionからDocker Composeの必要性を自動判断
4
4
  */
5
5
 
6
- import { readFileSync, existsSync } from 'fs';
6
+ import { existsSync } from 'fs';
7
+ import { safeReadFileOrThrow } from './safe-file-reader.js';
7
8
  import { join } from 'path';
8
9
  import { extractSection } from './markdown-parser.js';
9
10
 
@@ -25,7 +26,7 @@ export function analyzeDockerRequirement(feature: string, projectRoot: string =
25
26
  // design.mdを解析
26
27
  const designPath = join(projectRoot, '.kiro', 'specs', feature, 'design.md');
27
28
  if (existsSync(designPath)) {
28
- const design = readFileSync(designPath, 'utf-8');
29
+ const design = safeReadFileOrThrow(designPath, 'utf-8');
29
30
 
30
31
  // Technology Stackセクションを確認
31
32
  const techStack = extractSection(design, 'Technology Stack');
@@ -90,7 +91,7 @@ export function analyzeDockerRequirement(feature: string, projectRoot: string =
90
91
  const testSelectionPath = join(projectRoot, '.kiro', 'specs', feature, 'test-type-selection.json');
91
92
  if (existsSync(testSelectionPath)) {
92
93
  try {
93
- const testSelection = JSON.parse(readFileSync(testSelectionPath, 'utf-8'));
94
+ const testSelection = JSON.parse(safeReadFileOrThrow(testSelectionPath, 'utf-8'));
94
95
  const testTypes = testSelection.selectedTypes || [];
95
96
 
96
97
  // 統合テストが選択されている
@@ -118,7 +119,7 @@ export function analyzeDockerRequirement(feature: string, projectRoot: string =
118
119
  // requirements.mdを解析
119
120
  const requirementsPath = join(projectRoot, '.kiro', 'specs', feature, 'requirements.md');
120
121
  if (existsSync(requirementsPath)) {
121
- const requirements = readFileSync(requirementsPath, 'utf-8');
122
+ const requirements = safeReadFileOrThrow(requirementsPath, 'utf-8');
122
123
 
123
124
  // データ永続化の要件
124
125
  if (requirements.match(/データベース|database|永続化|persist/i)) {
@@ -8,7 +8,7 @@
8
8
  * - .envファイルの生成
9
9
  */
10
10
 
11
- import { readFileSync, existsSync } from 'fs';
11
+ import { existsSync } from 'fs';
12
12
  import * as readline from 'readline';
13
13
  import {
14
14
  getProjectIssueTypes,
@@ -17,6 +17,7 @@ import {
17
17
  filterStoryTypes,
18
18
  filterSubtaskTypes,
19
19
  } from './jira-issue-type-fetcher.js';
20
+ import { safeReadFileOrThrow } from './safe-file-reader.js';
20
21
 
21
22
  /**
22
23
  * 環境変数の設定項目定義
@@ -112,7 +113,7 @@ export function parseEnvFile(filePath: string): Map<string, string> {
112
113
  }
113
114
 
114
115
  try {
115
- const content = readFileSync(filePath, 'utf-8');
116
+ const content = safeReadFileOrThrow(filePath);
116
117
  const lines = content.split('\n');
117
118
 
118
119
  for (const line of lines) {
@@ -316,28 +317,37 @@ async function promptJiraIssueTypeId(
316
317
  ? ' 値を入力(Enter=デフォルト): '
317
318
  : ' 値を入力: ';
318
319
 
319
- const input = await question(rl, promptText);
320
+ const MAX_RETRIES = 5;
321
+ let retryCount = 0;
320
322
 
321
- // 入力が空の場合
322
- if (!input) {
323
- // 既存値があればそれを使用
324
- if (existingValue) {
325
- return existingValue;
326
- }
327
- // デフォルト値があればそれを使用
328
- if (config.defaultValue) {
329
- return config.defaultValue;
330
- }
331
- // 必須項目で値がない場合はエラー
332
- if (config.required) {
333
- console.log(' ⚠️ 必須項目です。値を入力してください。');
334
- return promptJiraIssueTypeId(rl, config, projectKey, existingValue);
323
+ while (true) {
324
+ const input = await question(rl, promptText);
325
+
326
+ // 入力が空の場合
327
+ if (!input) {
328
+ // 既存値があればそれを使用
329
+ if (existingValue) {
330
+ return existingValue;
331
+ }
332
+ // デフォルト値があればそれを使用
333
+ if (config.defaultValue) {
334
+ return config.defaultValue;
335
+ }
336
+ // 必須項目で値がない場合はエラー
337
+ if (config.required) {
338
+ retryCount++;
339
+ if (retryCount >= MAX_RETRIES) {
340
+ throw new Error(`必須項目 ${config.key} の入力が ${MAX_RETRIES} 回失敗しました`);
341
+ }
342
+ console.log(` ⚠️ 必須項目です。値を入力してください。(残り ${MAX_RETRIES - retryCount} 回)`);
343
+ continue;
344
+ }
345
+ // オプション項目は空文字を返す
346
+ return '';
335
347
  }
336
- // オプション項目は空文字を返す
337
- return '';
338
- }
339
348
 
340
- return input;
349
+ return input;
350
+ }
341
351
  }
342
352
 
343
353
  /**
@@ -384,28 +394,37 @@ export async function promptEnvValue(
384
394
  ? ' 値を入力(Enter=デフォルト): '
385
395
  : ' 値を入力: ';
386
396
 
387
- const input = await question(rl, promptText);
397
+ const MAX_RETRIES = 5;
398
+ let retryCount = 0;
388
399
 
389
- // 入力が空の場合
390
- if (!input) {
391
- // 既存値があればそれを使用
392
- if (existingValue) {
393
- return existingValue;
394
- }
395
- // デフォルト値があればそれを使用
396
- if (config.defaultValue) {
397
- return config.defaultValue;
398
- }
399
- // 必須項目で値がない場合はエラー
400
- if (config.required) {
401
- console.log(' ⚠️ 必須項目です。値を入力してください。');
402
- return promptEnvValue(rl, config, existingValue, projectKey);
400
+ while (true) {
401
+ const input = await question(rl, promptText);
402
+
403
+ // 入力が空の場合
404
+ if (!input) {
405
+ // 既存値があればそれを使用
406
+ if (existingValue) {
407
+ return existingValue;
408
+ }
409
+ // デフォルト値があればそれを使用
410
+ if (config.defaultValue) {
411
+ return config.defaultValue;
412
+ }
413
+ // 必須項目で値がない場合はエラー
414
+ if (config.required) {
415
+ retryCount++;
416
+ if (retryCount >= MAX_RETRIES) {
417
+ throw new Error(`必須項目 ${config.key} の入力が ${MAX_RETRIES} 回失敗しました`);
418
+ }
419
+ console.log(` ⚠️ 必須項目です。値を入力してください。(残り ${MAX_RETRIES - retryCount} 回)`);
420
+ continue;
421
+ }
422
+ // オプション項目は空文字を返す
423
+ return '';
403
424
  }
404
- // オプション項目は空文字を返す
405
- return '';
406
- }
407
425
 
408
- return input;
426
+ return input;
427
+ }
409
428
  }
410
429
 
411
430
  /**
@@ -3,10 +3,8 @@
3
3
  * kebab-case形式を強制
4
4
  */
5
5
 
6
- export interface ValidationResult {
7
- valid: boolean;
8
- errors: string[];
9
- }
6
+ import type { Result } from './types/validation.js';
7
+ import { success, failure } from './types/validation.js';
10
8
 
11
9
  /**
12
10
  * kebab-case形式の正規表現
@@ -19,23 +17,26 @@ const KEBAB_CASE_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
19
17
 
20
18
  /**
21
19
  * feature名がkebab-case形式か検証
20
+ *
21
+ * @returns Result<boolean, string> - 成功時は true、失敗時は false
22
22
  */
23
- export function validateFeatureName(featureName: string): ValidationResult {
23
+ export function validateFeatureName(featureName: string): Result<boolean, string> {
24
24
  const errors: string[] = [];
25
-
25
+ const warnings: string[] = [];
26
+
26
27
  // 空文字チェック
27
28
  if (!featureName || featureName.trim().length === 0) {
28
29
  errors.push('❌ feature名が空です');
29
- return { valid: false, errors };
30
+ return failure(errors);
30
31
  }
31
-
32
+
32
33
  const trimmed = featureName.trim();
33
-
34
+
34
35
  // kebab-case形式チェック
35
36
  if (!KEBAB_CASE_PATTERN.test(trimmed)) {
36
37
  errors.push(`❌ feature名が無効な形式です: "${trimmed}"`);
37
38
  errors.push(' 必須形式: 英語、kebab-case(ハイフン区切り)、小文字のみ');
38
-
39
+
39
40
  // 具体的な問題を特定
40
41
  if (/[A-Z]/.test(trimmed)) {
41
42
  errors.push(' → 大文字が含まれています(小文字に変換してください)');
@@ -59,29 +60,30 @@ export function validateFeatureName(featureName: string): ValidationResult {
59
60
  const invalidChars = trimmed.match(/[^a-z0-9-]/g);
60
61
  errors.push(` → 使用できない文字が含まれています: ${[...new Set(invalidChars)].join(', ')}`);
61
62
  }
62
-
63
+
63
64
  // 修正案を提示
64
65
  const suggestion = suggestFeatureName(trimmed);
65
66
  if (suggestion && suggestion !== trimmed) {
66
67
  errors.push(` 💡 修正案: "${suggestion}"`);
67
68
  }
68
69
  }
69
-
70
+
70
71
  // 長さチェック(推奨)
71
72
  if (trimmed.length > 50) {
72
- errors.push(`⚠️ feature名が長すぎます(${trimmed.length}文字)。50文字以内を推奨`);
73
+ warnings.push(`⚠️ feature名が長すぎます(${trimmed.length}文字)。50文字以内を推奨`);
73
74
  }
74
-
75
+
75
76
  // 単語数チェック(推奨)
76
77
  const wordCount = trimmed.split('-').length;
77
78
  if (wordCount > 5) {
78
- errors.push(`⚠️ 単語数が多すぎます(${wordCount}単語)。2-4単語を推奨`);
79
+ warnings.push(`⚠️ 単語数が多すぎます(${wordCount}単語)。2-4単語を推奨`);
80
+ }
81
+
82
+ if (errors.length > 0) {
83
+ return failure(errors, warnings);
79
84
  }
80
-
81
- return {
82
- valid: errors.length === 0,
83
- errors
84
- };
85
+
86
+ return success(true, warnings);
85
87
  }
86
88
 
87
89
  /**
@@ -103,8 +105,8 @@ export function suggestFeatureName(input: string): string {
103
105
  */
104
106
  export function validateFeatureNameOrThrow(featureName: string): void {
105
107
  const result = validateFeatureName(featureName);
106
-
107
- if (!result.valid) {
108
+
109
+ if (!result.success) {
108
110
  const errorMessage = [
109
111
  `Invalid feature name: "${featureName}"`,
110
112
  '',
@@ -112,24 +114,7 @@ export function validateFeatureNameOrThrow(featureName: string): void {
112
114
  '',
113
115
  'ヘルプ: README.md#機能名(feature)の命名規則 を参照してください'
114
116
  ].join('\n');
115
-
116
- throw new Error(errorMessage);
117
- }
118
- }
119
117
 
120
- /**
121
- * feature名をバリデートし、警告を表示(続行可能)
122
- */
123
- export function validateFeatureNameWithWarning(featureName: string): boolean {
124
- const result = validateFeatureName(featureName);
125
-
126
- if (!result.valid) {
127
- console.error('\n⚠️ Feature name validation failed:');
128
- result.errors.forEach(err => console.error(err));
129
- console.error('\nヘルプ: README.md#機能名(feature)の命名規則 を参照してください\n');
130
- return false;
118
+ throw new Error(errorMessage);
131
119
  }
132
-
133
- return true;
134
120
  }
135
-