@arimakouyou/spec-workflow-mcp 2.2.7

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 (472) hide show
  1. package/.claude-plugin/.mcp.json +8 -0
  2. package/.claude-plugin/agents/code-simplifier.md +80 -0
  3. package/.claude-plugin/agents/integ-test-auditor.md +91 -0
  4. package/.claude-plugin/agents/integ-test-worker.md +73 -0
  5. package/.claude-plugin/agents/parallel-worker.md +136 -0
  6. package/.claude-plugin/agents/review-worker.md +279 -0
  7. package/.claude-plugin/agents/unit-test-engineer.md +148 -0
  8. package/.claude-plugin/agents/wave-harness-worker.md +158 -0
  9. package/.claude-plugin/hooks/hooks.json +16 -0
  10. package/.claude-plugin/hooks/tasks-read-guard.sh +17 -0
  11. package/.claude-plugin/marketplace.json +33 -0
  12. package/.claude-plugin/plugin.json +11 -0
  13. package/.claude-plugin/rules/axum.md +154 -0
  14. package/.claude-plugin/rules/cargo-toml.md +63 -0
  15. package/.claude-plugin/rules/context7.md +17 -0
  16. package/.claude-plugin/rules/design-conformance.md +82 -0
  17. package/.claude-plugin/rules/design-principles.md +53 -0
  18. package/.claude-plugin/rules/diesel.md +176 -0
  19. package/.claude-plugin/rules/feedback-loop.md +33 -0
  20. package/.claude-plugin/rules/leptos.md +319 -0
  21. package/.claude-plugin/rules/project-architecture.md +134 -0
  22. package/.claude-plugin/rules/quality-checks.md +265 -0
  23. package/.claude-plugin/rules/rust-style.md +242 -0
  24. package/.claude-plugin/rules/security.md +67 -0
  25. package/.claude-plugin/rules/spec-workflow-enforcement.md +47 -0
  26. package/.claude-plugin/rules/valkey.md +167 -0
  27. package/.claude-plugin/skills/integration-test/SKILL.md +230 -0
  28. package/.claude-plugin/skills/integration-test/references/auditor-prompt.md +78 -0
  29. package/.claude-plugin/skills/integration-test/references/external-api-mock.md +98 -0
  30. package/.claude-plugin/skills/integration-test/references/fixture-catalog.md +155 -0
  31. package/.claude-plugin/skills/integration-test/references/parallel-execution.md +124 -0
  32. package/.claude-plugin/skills/integration-test/references/quality-gate.md +80 -0
  33. package/.claude-plugin/skills/integration-test/references/test-case-design.md +88 -0
  34. package/.claude-plugin/skills/integration-test/references/test-patterns.md +215 -0
  35. package/.claude-plugin/skills/integration-test/references/whiteboard-template.md +81 -0
  36. package/.claude-plugin/skills/integration-test/references/worker-prompt.md +70 -0
  37. package/.claude-plugin/skills/knowhow-capture/SKILL.md +143 -0
  38. package/.claude-plugin/skills/phase-review-team/SKILL.md +380 -0
  39. package/.claude-plugin/skills/spec-design/SKILL.md +282 -0
  40. package/.claude-plugin/skills/spec-e2e-implement/SKILL.md +259 -0
  41. package/.claude-plugin/skills/spec-impl-code/SKILL.md +101 -0
  42. package/.claude-plugin/skills/spec-impl-review/SKILL.md +115 -0
  43. package/.claude-plugin/skills/spec-impl-test-run/SKILL.md +98 -0
  44. package/.claude-plugin/skills/spec-impl-test-write/SKILL.md +121 -0
  45. package/.claude-plugin/skills/spec-implement/SKILL.md +822 -0
  46. package/.claude-plugin/skills/spec-requirements/SKILL.md +130 -0
  47. package/.claude-plugin/skills/spec-review/SKILL.md +274 -0
  48. package/.claude-plugin/skills/spec-tasks/SKILL.md +372 -0
  49. package/.claude-plugin/skills/spec-test-design/SKILL.md +233 -0
  50. package/.claude-plugin/skills/tdd-skills/SKILL.md +95 -0
  51. package/.claude-plugin/skills/tdd-skills/references/advanced-techniques.md +49 -0
  52. package/.claude-plugin/skills/tdd-skills/references/green-strategies.md +70 -0
  53. package/.claude-plugin/skills/tdd-skills/references/tdd-and-design.md +48 -0
  54. package/.claude-plugin/skills/tdd-skills/references/test-design.md +43 -0
  55. package/.claude-plugin/skills/tdd-skills/references/test-doubles.md +53 -0
  56. package/.claude-plugin/skills/tdd-skills/references/test-patterns.md +40 -0
  57. package/.claude-plugin/skills/tdd-skills-rust/SKILL.md +128 -0
  58. package/.claude-plugin/skills/tdd-skills-rust/references/advanced-techniques.md +205 -0
  59. package/.claude-plugin/skills/tdd-skills-rust/references/green-strategies.md +166 -0
  60. package/.claude-plugin/skills/tdd-skills-rust/references/tdd-and-design.md +215 -0
  61. package/.claude-plugin/skills/tdd-skills-rust/references/test-design.md +128 -0
  62. package/.claude-plugin/skills/tdd-skills-rust/references/test-doubles.md +208 -0
  63. package/.claude-plugin/skills/tdd-skills-rust/references/test-patterns.md +223 -0
  64. package/.claude-plugin/with-dashboard/.mcp.json +8 -0
  65. package/.claude-plugin/with-dashboard/plugin.json +10 -0
  66. package/CHANGELOG.md +1007 -0
  67. package/LICENSE +674 -0
  68. package/README.ja.md +380 -0
  69. package/README.md +437 -0
  70. package/dist/__tests__/config.test.d.ts +2 -0
  71. package/dist/__tests__/config.test.d.ts.map +1 -0
  72. package/dist/__tests__/config.test.js +264 -0
  73. package/dist/__tests__/config.test.js.map +1 -0
  74. package/dist/__tests__/index-args.test.d.ts +2 -0
  75. package/dist/__tests__/index-args.test.d.ts.map +1 -0
  76. package/dist/__tests__/index-args.test.js +43 -0
  77. package/dist/__tests__/index-args.test.js.map +1 -0
  78. package/dist/__tests__/index-entrypoint.test.d.ts +2 -0
  79. package/dist/__tests__/index-entrypoint.test.d.ts.map +1 -0
  80. package/dist/__tests__/index-entrypoint.test.js +23 -0
  81. package/dist/__tests__/index-entrypoint.test.js.map +1 -0
  82. package/dist/config.d.ts +26 -0
  83. package/dist/config.d.ts.map +1 -0
  84. package/dist/config.js +188 -0
  85. package/dist/config.js.map +1 -0
  86. package/dist/core/__tests__/git-utils.test.d.ts +2 -0
  87. package/dist/core/__tests__/git-utils.test.d.ts.map +1 -0
  88. package/dist/core/__tests__/git-utils.test.js +179 -0
  89. package/dist/core/__tests__/git-utils.test.js.map +1 -0
  90. package/dist/core/__tests__/mdx-validator.test.d.ts +2 -0
  91. package/dist/core/__tests__/mdx-validator.test.d.ts.map +1 -0
  92. package/dist/core/__tests__/mdx-validator.test.js +42 -0
  93. package/dist/core/__tests__/mdx-validator.test.js.map +1 -0
  94. package/dist/core/__tests__/path-utils.test.d.ts +2 -0
  95. package/dist/core/__tests__/path-utils.test.d.ts.map +1 -0
  96. package/dist/core/__tests__/path-utils.test.js +342 -0
  97. package/dist/core/__tests__/path-utils.test.js.map +1 -0
  98. package/dist/core/__tests__/project-registry.test.d.ts +2 -0
  99. package/dist/core/__tests__/project-registry.test.d.ts.map +1 -0
  100. package/dist/core/__tests__/project-registry.test.js +62 -0
  101. package/dist/core/__tests__/project-registry.test.js.map +1 -0
  102. package/dist/core/__tests__/security-utils.test.d.ts +2 -0
  103. package/dist/core/__tests__/security-utils.test.d.ts.map +1 -0
  104. package/dist/core/__tests__/security-utils.test.js +657 -0
  105. package/dist/core/__tests__/security-utils.test.js.map +1 -0
  106. package/dist/core/__tests__/task-parser.test.d.ts +2 -0
  107. package/dist/core/__tests__/task-parser.test.d.ts.map +1 -0
  108. package/dist/core/__tests__/task-parser.test.js +222 -0
  109. package/dist/core/__tests__/task-parser.test.js.map +1 -0
  110. package/dist/core/__tests__/task-validator.test.d.ts +2 -0
  111. package/dist/core/__tests__/task-validator.test.d.ts.map +1 -0
  112. package/dist/core/__tests__/task-validator.test.js +308 -0
  113. package/dist/core/__tests__/task-validator.test.js.map +1 -0
  114. package/dist/core/archive-service.d.ts +10 -0
  115. package/dist/core/archive-service.d.ts.map +1 -0
  116. package/dist/core/archive-service.js +99 -0
  117. package/dist/core/archive-service.js.map +1 -0
  118. package/dist/core/dashboard-session.d.ts +49 -0
  119. package/dist/core/dashboard-session.d.ts.map +1 -0
  120. package/dist/core/dashboard-session.js +132 -0
  121. package/dist/core/dashboard-session.js.map +1 -0
  122. package/dist/core/git-utils.d.ts +25 -0
  123. package/dist/core/git-utils.d.ts.map +1 -0
  124. package/dist/core/git-utils.js +87 -0
  125. package/dist/core/git-utils.js.map +1 -0
  126. package/dist/core/global-dir.d.ts +44 -0
  127. package/dist/core/global-dir.d.ts.map +1 -0
  128. package/dist/core/global-dir.js +74 -0
  129. package/dist/core/global-dir.js.map +1 -0
  130. package/dist/core/implementation-log-migrator.d.ts +41 -0
  131. package/dist/core/implementation-log-migrator.d.ts.map +1 -0
  132. package/dist/core/implementation-log-migrator.js +258 -0
  133. package/dist/core/implementation-log-migrator.js.map +1 -0
  134. package/dist/core/mdx-validator.d.ts +14 -0
  135. package/dist/core/mdx-validator.d.ts.map +1 -0
  136. package/dist/core/mdx-validator.js +34 -0
  137. package/dist/core/mdx-validator.js.map +1 -0
  138. package/dist/core/parser.d.ts +11 -0
  139. package/dist/core/parser.d.ts.map +1 -0
  140. package/dist/core/parser.js +128 -0
  141. package/dist/core/parser.js.map +1 -0
  142. package/dist/core/path-utils.d.ts +68 -0
  143. package/dist/core/path-utils.d.ts.map +1 -0
  144. package/dist/core/path-utils.js +302 -0
  145. package/dist/core/path-utils.js.map +1 -0
  146. package/dist/core/project-registry.d.ts +94 -0
  147. package/dist/core/project-registry.d.ts.map +1 -0
  148. package/dist/core/project-registry.js +297 -0
  149. package/dist/core/project-registry.js.map +1 -0
  150. package/dist/core/security-utils.d.ts +99 -0
  151. package/dist/core/security-utils.d.ts.map +1 -0
  152. package/dist/core/security-utils.js +275 -0
  153. package/dist/core/security-utils.js.map +1 -0
  154. package/dist/core/task-parser.d.ts +90 -0
  155. package/dist/core/task-parser.d.ts.map +1 -0
  156. package/dist/core/task-parser.js +477 -0
  157. package/dist/core/task-parser.js.map +1 -0
  158. package/dist/core/task-validator.d.ts +37 -0
  159. package/dist/core/task-validator.d.ts.map +1 -0
  160. package/dist/core/task-validator.js +499 -0
  161. package/dist/core/task-validator.js.map +1 -0
  162. package/dist/core/workspace-initializer.d.ts +16 -0
  163. package/dist/core/workspace-initializer.d.ts.map +1 -0
  164. package/dist/core/workspace-initializer.js +168 -0
  165. package/dist/core/workspace-initializer.js.map +1 -0
  166. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts +2 -0
  167. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.d.ts.map +1 -0
  168. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js +78 -0
  169. package/dist/dashboard/__tests__/approval-storage-path-resolution.test.js.map +1 -0
  170. package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts +2 -0
  171. package/dist/dashboard/__tests__/multi-server-approvals-content.test.d.ts.map +1 -0
  172. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js +115 -0
  173. package/dist/dashboard/__tests__/multi-server-approvals-content.test.js.map +1 -0
  174. package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts +2 -0
  175. package/dist/dashboard/__tests__/watcher-error-handling.test.d.ts.map +1 -0
  176. package/dist/dashboard/__tests__/watcher-error-handling.test.js +118 -0
  177. package/dist/dashboard/__tests__/watcher-error-handling.test.js.map +1 -0
  178. package/dist/dashboard/approval-storage.d.ts +139 -0
  179. package/dist/dashboard/approval-storage.d.ts.map +1 -0
  180. package/dist/dashboard/approval-storage.js +608 -0
  181. package/dist/dashboard/approval-storage.js.map +1 -0
  182. package/dist/dashboard/execution-history-manager.d.ts +52 -0
  183. package/dist/dashboard/execution-history-manager.d.ts.map +1 -0
  184. package/dist/dashboard/execution-history-manager.js +161 -0
  185. package/dist/dashboard/execution-history-manager.js.map +1 -0
  186. package/dist/dashboard/implementation-log-manager.d.ts +97 -0
  187. package/dist/dashboard/implementation-log-manager.d.ts.map +1 -0
  188. package/dist/dashboard/implementation-log-manager.js +617 -0
  189. package/dist/dashboard/implementation-log-manager.js.map +1 -0
  190. package/dist/dashboard/job-scheduler.d.ts +91 -0
  191. package/dist/dashboard/job-scheduler.d.ts.map +1 -0
  192. package/dist/dashboard/job-scheduler.js +321 -0
  193. package/dist/dashboard/job-scheduler.js.map +1 -0
  194. package/dist/dashboard/multi-server.d.ts +42 -0
  195. package/dist/dashboard/multi-server.d.ts.map +1 -0
  196. package/dist/dashboard/multi-server.js +1460 -0
  197. package/dist/dashboard/multi-server.js.map +1 -0
  198. package/dist/dashboard/parser.d.ts +18 -0
  199. package/dist/dashboard/parser.d.ts.map +1 -0
  200. package/dist/dashboard/parser.js +269 -0
  201. package/dist/dashboard/parser.js.map +1 -0
  202. package/dist/dashboard/project-manager.d.ts +82 -0
  203. package/dist/dashboard/project-manager.d.ts.map +1 -0
  204. package/dist/dashboard/project-manager.js +257 -0
  205. package/dist/dashboard/project-manager.js.map +1 -0
  206. package/dist/dashboard/public/assets/Inter-Bold-CD3Pr7BX.woff2 +0 -0
  207. package/dist/dashboard/public/assets/Inter-Medium-B_8v_WHh.woff2 +0 -0
  208. package/dist/dashboard/public/assets/Inter-Regular-DRVdRqcI.woff2 +0 -0
  209. package/dist/dashboard/public/assets/Inter-SemiBold-CtskMddL.woff2 +0 -0
  210. package/dist/dashboard/public/assets/JetBrainsMono-Bold-D4WEaHbo.woff2 +0 -0
  211. package/dist/dashboard/public/assets/JetBrainsMono-Medium-3S3k2nMz.woff2 +0 -0
  212. package/dist/dashboard/public/assets/JetBrainsMono-Regular-BQaDgvhP.woff2 +0 -0
  213. package/dist/dashboard/public/assets/Tableau10-B-NsZVaP.js +1 -0
  214. package/dist/dashboard/public/assets/apl-B4CMkyY2.js +1 -0
  215. package/dist/dashboard/public/assets/arc-a5wW942W.js +1 -0
  216. package/dist/dashboard/public/assets/array-BKyUJesY.js +1 -0
  217. package/dist/dashboard/public/assets/asciiarmor-Df11BRmG.js +1 -0
  218. package/dist/dashboard/public/assets/asn1-EdZsLKOL.js +1 -0
  219. package/dist/dashboard/public/assets/asterisk-B-8jnY81.js +1 -0
  220. package/dist/dashboard/public/assets/blockDiagram-c4efeb88-CvjTuK-w.js +118 -0
  221. package/dist/dashboard/public/assets/brainfuck-C4LP7Hcl.js +1 -0
  222. package/dist/dashboard/public/assets/c4Diagram-c83219d4-NwVQo5kf.js +10 -0
  223. package/dist/dashboard/public/assets/channel-Bi16YZhk.js +1 -0
  224. package/dist/dashboard/public/assets/classDiagram-beda092f-BmSeXDdU.js +2 -0
  225. package/dist/dashboard/public/assets/classDiagram-v2-2358418a-D7GvvuPr.js +2 -0
  226. package/dist/dashboard/public/assets/clike-B9uivgTg.js +1 -0
  227. package/dist/dashboard/public/assets/clojure-BMjYHr_A.js +1 -0
  228. package/dist/dashboard/public/assets/clone-BpKTiq7P.js +1 -0
  229. package/dist/dashboard/public/assets/cmake-BQqOBYOt.js +1 -0
  230. package/dist/dashboard/public/assets/cobol-CWcv1MsR.js +1 -0
  231. package/dist/dashboard/public/assets/coffeescript-S37ZYGWr.js +1 -0
  232. package/dist/dashboard/public/assets/commonlisp-DBKNyK5s.js +1 -0
  233. package/dist/dashboard/public/assets/createText-1719965b-qASbqHUP.js +7 -0
  234. package/dist/dashboard/public/assets/crystal-SjHAIU92.js +1 -0
  235. package/dist/dashboard/public/assets/css-BnMrqG3P.js +1 -0
  236. package/dist/dashboard/public/assets/cypher-C_CwsFkJ.js +1 -0
  237. package/dist/dashboard/public/assets/d-pRatUO7H.js +1 -0
  238. package/dist/dashboard/public/assets/diff-DbItnlRl.js +1 -0
  239. package/dist/dashboard/public/assets/dockerfile-BKs6k2Af.js +1 -0
  240. package/dist/dashboard/public/assets/dtd-DF_7sFjM.js +1 -0
  241. package/dist/dashboard/public/assets/dylan-DwRh75JA.js +1 -0
  242. package/dist/dashboard/public/assets/ebnf-CDyGwa7X.js +1 -0
  243. package/dist/dashboard/public/assets/ecl-Cabwm37j.js +1 -0
  244. package/dist/dashboard/public/assets/edges-96097737-BItTSnH7.js +4 -0
  245. package/dist/dashboard/public/assets/eiffel-CnydiIhH.js +1 -0
  246. package/dist/dashboard/public/assets/elm-vLlmbW-K.js +1 -0
  247. package/dist/dashboard/public/assets/erDiagram-0228fc6a-DT224olg.js +51 -0
  248. package/dist/dashboard/public/assets/erlang-BNw1qcRV.js +1 -0
  249. package/dist/dashboard/public/assets/factor-kuTfRLto.js +1 -0
  250. package/dist/dashboard/public/assets/fcl-Kvtd6kyn.js +1 -0
  251. package/dist/dashboard/public/assets/flowDb-c6c81e3f-D9_ukKtv.js +10 -0
  252. package/dist/dashboard/public/assets/flowDiagram-50d868cf-CylE8siG.js +4 -0
  253. package/dist/dashboard/public/assets/flowDiagram-v2-4f6560a1-B2O3JN7Y.js +1 -0
  254. package/dist/dashboard/public/assets/flowchart-elk-definition-6af322e1-BCaqFKf3.js +139 -0
  255. package/dist/dashboard/public/assets/forth-Ffai-XNe.js +1 -0
  256. package/dist/dashboard/public/assets/fortran-DYz_wnZ1.js +1 -0
  257. package/dist/dashboard/public/assets/ganttDiagram-a2739b55-WQUL1QW_.js +257 -0
  258. package/dist/dashboard/public/assets/gas-Bneqetm1.js +1 -0
  259. package/dist/dashboard/public/assets/gherkin-heZmZLOM.js +1 -0
  260. package/dist/dashboard/public/assets/gitGraphDiagram-82fe8481-CttZrdmr.js +70 -0
  261. package/dist/dashboard/public/assets/graph-Ch-rVueN.js +1 -0
  262. package/dist/dashboard/public/assets/groovy-D9Dt4D0W.js +1 -0
  263. package/dist/dashboard/public/assets/haskell-Cw1EW3IL.js +1 -0
  264. package/dist/dashboard/public/assets/haxe-H-WmDvRZ.js +1 -0
  265. package/dist/dashboard/public/assets/http-DBlCnlav.js +1 -0
  266. package/dist/dashboard/public/assets/idl-BEugSyMb.js +1 -0
  267. package/dist/dashboard/public/assets/index--kbPpDKv.js +1 -0
  268. package/dist/dashboard/public/assets/index-3scDwWm6.js +1 -0
  269. package/dist/dashboard/public/assets/index-5325376f-BL2zVOJU.js +1 -0
  270. package/dist/dashboard/public/assets/index-BZdjbO25.js +1 -0
  271. package/dist/dashboard/public/assets/index-BmA_batZ.js +1 -0
  272. package/dist/dashboard/public/assets/index-Bu0u99kF.js +2 -0
  273. package/dist/dashboard/public/assets/index-Ch-lr7F4.js +1 -0
  274. package/dist/dashboard/public/assets/index-ClgWbdoq.js +1 -0
  275. package/dist/dashboard/public/assets/index-CzLwOMQ_.js +3 -0
  276. package/dist/dashboard/public/assets/index-DAOEjGO7.js +1 -0
  277. package/dist/dashboard/public/assets/index-DXqf0B9c.js +1 -0
  278. package/dist/dashboard/public/assets/index-DegWdR16.js +1 -0
  279. package/dist/dashboard/public/assets/index-DiHyYGim.js +1 -0
  280. package/dist/dashboard/public/assets/index-DlZtG7I5.js +1 -0
  281. package/dist/dashboard/public/assets/index-DmhGE2M8.js +1 -0
  282. package/dist/dashboard/public/assets/index-QEGvld4x.js +1 -0
  283. package/dist/dashboard/public/assets/index-RfZPGAJu.js +1 -0
  284. package/dist/dashboard/public/assets/index-UybBj_7u.js +319 -0
  285. package/dist/dashboard/public/assets/index-bVekzPnl.js +7 -0
  286. package/dist/dashboard/public/assets/index-f5bysQzW.css +1 -0
  287. package/dist/dashboard/public/assets/infoDiagram-8eee0895-DjzkkE3o.js +7 -0
  288. package/dist/dashboard/public/assets/init-Gi6I4Gst.js +1 -0
  289. package/dist/dashboard/public/assets/javascript-iXu5QeM3.js +1 -0
  290. package/dist/dashboard/public/assets/journeyDiagram-c64418c1-CxPZkNdB.js +139 -0
  291. package/dist/dashboard/public/assets/julia-DuME0IfC.js +1 -0
  292. package/dist/dashboard/public/assets/katex-XbL3y5x-.js +261 -0
  293. package/dist/dashboard/public/assets/layout-DX7DNTRm.js +1 -0
  294. package/dist/dashboard/public/assets/line-DfvpmKOn.js +1 -0
  295. package/dist/dashboard/public/assets/linear-gQbBPHO5.js +1 -0
  296. package/dist/dashboard/public/assets/livescript-BwQOo05w.js +1 -0
  297. package/dist/dashboard/public/assets/lua-BgMRiT3U.js +1 -0
  298. package/dist/dashboard/public/assets/mathematica-DTrFuWx2.js +1 -0
  299. package/dist/dashboard/public/assets/mbox-CNhZ1qSd.js +1 -0
  300. package/dist/dashboard/public/assets/mindmap-definition-8da855dc-CNxmpyG6.js +415 -0
  301. package/dist/dashboard/public/assets/mirc-CjQqDB4T.js +1 -0
  302. package/dist/dashboard/public/assets/mllike-CXdrOF99.js +1 -0
  303. package/dist/dashboard/public/assets/modelica-Dc1JOy9r.js +1 -0
  304. package/dist/dashboard/public/assets/mscgen-BA5vi2Kp.js +1 -0
  305. package/dist/dashboard/public/assets/mumps-BT43cFF4.js +1 -0
  306. package/dist/dashboard/public/assets/nginx-DdIZxoE0.js +1 -0
  307. package/dist/dashboard/public/assets/nsis-LdVXkNf5.js +1 -0
  308. package/dist/dashboard/public/assets/ntriples-BfvgReVJ.js +1 -0
  309. package/dist/dashboard/public/assets/octave-Ck1zUtKM.js +1 -0
  310. package/dist/dashboard/public/assets/ordinal-Cboi1Yqb.js +1 -0
  311. package/dist/dashboard/public/assets/oz-BzwKVEFT.js +1 -0
  312. package/dist/dashboard/public/assets/pascal--L3eBynH.js +1 -0
  313. package/dist/dashboard/public/assets/path-CbwjOpE9.js +1 -0
  314. package/dist/dashboard/public/assets/perl-CdXCOZ3F.js +1 -0
  315. package/dist/dashboard/public/assets/pieDiagram-a8764435-D-xy_NSA.js +35 -0
  316. package/dist/dashboard/public/assets/pig-CevX1Tat.js +1 -0
  317. package/dist/dashboard/public/assets/powershell-CFHJl5sT.js +1 -0
  318. package/dist/dashboard/public/assets/properties-C78fOPTZ.js +1 -0
  319. package/dist/dashboard/public/assets/protobuf-ChK-085T.js +1 -0
  320. package/dist/dashboard/public/assets/pug-DeIclll2.js +1 -0
  321. package/dist/dashboard/public/assets/puppet-DMA9R1ak.js +1 -0
  322. package/dist/dashboard/public/assets/python-BuPzkPfP.js +1 -0
  323. package/dist/dashboard/public/assets/q-pXgVlZs6.js +1 -0
  324. package/dist/dashboard/public/assets/quadrantDiagram-1e28029f-BoL2wzz0.js +7 -0
  325. package/dist/dashboard/public/assets/r-B6wPVr8A.js +1 -0
  326. package/dist/dashboard/public/assets/requirementDiagram-08caed73-BujFz0q1.js +52 -0
  327. package/dist/dashboard/public/assets/rpm-CTu-6PCP.js +1 -0
  328. package/dist/dashboard/public/assets/ruby-B2Rjki9n.js +1 -0
  329. package/dist/dashboard/public/assets/sankeyDiagram-a04cb91d-D03_NARm.js +8 -0
  330. package/dist/dashboard/public/assets/sas-B4kiWyti.js +1 -0
  331. package/dist/dashboard/public/assets/scheme-C41bIUwD.js +1 -0
  332. package/dist/dashboard/public/assets/sequenceDiagram-c5b8d532-B65eFcaT.js +122 -0
  333. package/dist/dashboard/public/assets/shell-CjFT_Tl9.js +1 -0
  334. package/dist/dashboard/public/assets/sieve-C3Gn_uJK.js +1 -0
  335. package/dist/dashboard/public/assets/simple-mode-GW_nhZxv.js +1 -0
  336. package/dist/dashboard/public/assets/smalltalk-CnHTOXQT.js +1 -0
  337. package/dist/dashboard/public/assets/solr-DehyRSwq.js +1 -0
  338. package/dist/dashboard/public/assets/sparql-DkYu6x3z.js +1 -0
  339. package/dist/dashboard/public/assets/spreadsheet-BCZA_wO0.js +1 -0
  340. package/dist/dashboard/public/assets/sql-D0XecflT.js +1 -0
  341. package/dist/dashboard/public/assets/stateDiagram-1ecb1508-BDbqu0Vl.js +1 -0
  342. package/dist/dashboard/public/assets/stateDiagram-v2-c2b004d7-CBHvk4b8.js +1 -0
  343. package/dist/dashboard/public/assets/stex-C3f8Ysf7.js +1 -0
  344. package/dist/dashboard/public/assets/styles-b4e223ce-CELsPqaO.js +160 -0
  345. package/dist/dashboard/public/assets/styles-ca3715f6-BRqMqT6F.js +207 -0
  346. package/dist/dashboard/public/assets/styles-d45a18b0-e8N-oLPy.js +116 -0
  347. package/dist/dashboard/public/assets/stylus-B533Al4x.js +1 -0
  348. package/dist/dashboard/public/assets/svgDrawCommon-b86b1483-vNDtmQc-.js +1 -0
  349. package/dist/dashboard/public/assets/swift-BzpIVaGY.js +1 -0
  350. package/dist/dashboard/public/assets/tcl-DVfN8rqt.js +1 -0
  351. package/dist/dashboard/public/assets/textile-CnDTJFAw.js +1 -0
  352. package/dist/dashboard/public/assets/tiddlywiki-DO-Gjzrf.js +1 -0
  353. package/dist/dashboard/public/assets/tiki-DGYXhP31.js +1 -0
  354. package/dist/dashboard/public/assets/timeline-definition-faaaa080-Dh2_A5VU.js +61 -0
  355. package/dist/dashboard/public/assets/toml-Bm5Em-hy.js +1 -0
  356. package/dist/dashboard/public/assets/troff-wAsdV37c.js +1 -0
  357. package/dist/dashboard/public/assets/ttcn-CfJYG6tj.js +1 -0
  358. package/dist/dashboard/public/assets/ttcn-cfg-B9xdYoR4.js +1 -0
  359. package/dist/dashboard/public/assets/turtle-B1tBg_DP.js +1 -0
  360. package/dist/dashboard/public/assets/vb-CmGdzxic.js +1 -0
  361. package/dist/dashboard/public/assets/vbscript-BuJXcnF6.js +1 -0
  362. package/dist/dashboard/public/assets/velocity-D8B20fx6.js +1 -0
  363. package/dist/dashboard/public/assets/verilog-C6RDOZhf.js +1 -0
  364. package/dist/dashboard/public/assets/vhdl-lSbBsy5d.js +1 -0
  365. package/dist/dashboard/public/assets/webidl-ZXfAyPTL.js +1 -0
  366. package/dist/dashboard/public/assets/xquery-DzFWVndE.js +1 -0
  367. package/dist/dashboard/public/assets/xychartDiagram-f5964ef8-B76v1AVF.js +7 -0
  368. package/dist/dashboard/public/assets/yacas-BJ4BC0dw.js +1 -0
  369. package/dist/dashboard/public/assets/z80-Hz9HOZM7.js +1 -0
  370. package/dist/dashboard/public/claude-icon-dark.svg +1 -0
  371. package/dist/dashboard/public/claude-icon.svg +1 -0
  372. package/dist/dashboard/public/index.html +16 -0
  373. package/dist/dashboard/settings-manager.d.ts +47 -0
  374. package/dist/dashboard/settings-manager.d.ts.map +1 -0
  375. package/dist/dashboard/settings-manager.js +180 -0
  376. package/dist/dashboard/settings-manager.js.map +1 -0
  377. package/dist/dashboard/utils.d.ts +31 -0
  378. package/dist/dashboard/utils.d.ts.map +1 -0
  379. package/dist/dashboard/utils.js +102 -0
  380. package/dist/dashboard/utils.js.map +1 -0
  381. package/dist/dashboard/watcher.d.ts +32 -0
  382. package/dist/dashboard/watcher.d.ts.map +1 -0
  383. package/dist/dashboard/watcher.js +173 -0
  384. package/dist/dashboard/watcher.js.map +1 -0
  385. package/dist/index.d.ts +13 -0
  386. package/dist/index.d.ts.map +1 -0
  387. package/dist/index.js +380 -0
  388. package/dist/index.js.map +1 -0
  389. package/dist/markdown/templates/design-template.md +126 -0
  390. package/dist/markdown/templates/product-template.md +51 -0
  391. package/dist/markdown/templates/requirements-template.md +50 -0
  392. package/dist/markdown/templates/structure-template.md +145 -0
  393. package/dist/markdown/templates/tasks-template.md +100 -0
  394. package/dist/markdown/templates/tech-template.md +99 -0
  395. package/dist/markdown/templates/test-design-template.md +221 -0
  396. package/dist/prompts/create-spec.d.ts +3 -0
  397. package/dist/prompts/create-spec.d.ts.map +1 -0
  398. package/dist/prompts/create-spec.js +97 -0
  399. package/dist/prompts/create-spec.js.map +1 -0
  400. package/dist/prompts/create-steering-doc.d.ts +3 -0
  401. package/dist/prompts/create-steering-doc.d.ts.map +1 -0
  402. package/dist/prompts/create-steering-doc.js +75 -0
  403. package/dist/prompts/create-steering-doc.js.map +1 -0
  404. package/dist/prompts/implement-task.d.ts +3 -0
  405. package/dist/prompts/implement-task.d.ts.map +1 -0
  406. package/dist/prompts/implement-task.js +174 -0
  407. package/dist/prompts/implement-task.js.map +1 -0
  408. package/dist/prompts/index.d.ts +20 -0
  409. package/dist/prompts/index.d.ts.map +1 -0
  410. package/dist/prompts/index.js +103 -0
  411. package/dist/prompts/index.js.map +1 -0
  412. package/dist/prompts/inject-spec-workflow-guide.d.ts +3 -0
  413. package/dist/prompts/inject-spec-workflow-guide.d.ts.map +1 -0
  414. package/dist/prompts/inject-spec-workflow-guide.js +60 -0
  415. package/dist/prompts/inject-spec-workflow-guide.js.map +1 -0
  416. package/dist/prompts/inject-steering-guide.d.ts +3 -0
  417. package/dist/prompts/inject-steering-guide.d.ts.map +1 -0
  418. package/dist/prompts/inject-steering-guide.js +64 -0
  419. package/dist/prompts/inject-steering-guide.js.map +1 -0
  420. package/dist/prompts/refresh-tasks.d.ts +3 -0
  421. package/dist/prompts/refresh-tasks.d.ts.map +1 -0
  422. package/dist/prompts/refresh-tasks.js +237 -0
  423. package/dist/prompts/refresh-tasks.js.map +1 -0
  424. package/dist/prompts/spec-status.d.ts +3 -0
  425. package/dist/prompts/spec-status.d.ts.map +1 -0
  426. package/dist/prompts/spec-status.js +77 -0
  427. package/dist/prompts/spec-status.js.map +1 -0
  428. package/dist/prompts/types.d.ts +13 -0
  429. package/dist/prompts/types.d.ts.map +1 -0
  430. package/dist/prompts/types.js +2 -0
  431. package/dist/prompts/types.js.map +1 -0
  432. package/dist/server.d.ts +17 -0
  433. package/dist/server.d.ts.map +1 -0
  434. package/dist/server.js +175 -0
  435. package/dist/server.js.map +1 -0
  436. package/dist/tools/__tests__/log-implementation-review-process.test.d.ts +2 -0
  437. package/dist/tools/__tests__/log-implementation-review-process.test.d.ts.map +1 -0
  438. package/dist/tools/__tests__/log-implementation-review-process.test.js +190 -0
  439. package/dist/tools/__tests__/log-implementation-review-process.test.js.map +1 -0
  440. package/dist/tools/__tests__/projectPath.test.d.ts +2 -0
  441. package/dist/tools/__tests__/projectPath.test.d.ts.map +1 -0
  442. package/dist/tools/__tests__/projectPath.test.js +187 -0
  443. package/dist/tools/__tests__/projectPath.test.js.map +1 -0
  444. package/dist/tools/approvals.d.ts +14 -0
  445. package/dist/tools/approvals.d.ts.map +1 -0
  446. package/dist/tools/approvals.js +505 -0
  447. package/dist/tools/approvals.js.map +1 -0
  448. package/dist/tools/index.d.ts +5 -0
  449. package/dist/tools/index.d.ts.map +1 -0
  450. package/dist/tools/index.js +52 -0
  451. package/dist/tools/index.js.map +1 -0
  452. package/dist/tools/log-implementation.d.ts +5 -0
  453. package/dist/tools/log-implementation.d.ts.map +1 -0
  454. package/dist/tools/log-implementation.js +498 -0
  455. package/dist/tools/log-implementation.js.map +1 -0
  456. package/dist/tools/spec-status.d.ts +5 -0
  457. package/dist/tools/spec-status.d.ts.map +1 -0
  458. package/dist/tools/spec-status.js +192 -0
  459. package/dist/tools/spec-status.js.map +1 -0
  460. package/dist/tools/spec-workflow-guide.d.ts +5 -0
  461. package/dist/tools/spec-workflow-guide.d.ts.map +1 -0
  462. package/dist/tools/spec-workflow-guide.js +116 -0
  463. package/dist/tools/spec-workflow-guide.js.map +1 -0
  464. package/dist/tools/steering-guide.d.ts +5 -0
  465. package/dist/tools/steering-guide.d.ts.map +1 -0
  466. package/dist/tools/steering-guide.js +192 -0
  467. package/dist/tools/steering-guide.js.map +1 -0
  468. package/dist/types.d.ts +183 -0
  469. package/dist/types.d.ts.map +1 -0
  470. package/dist/types.js +13 -0
  471. package/dist/types.js.map +1 -0
  472. package/package.json +106 -0
@@ -0,0 +1,155 @@
1
+ # 共通ヘルパー・Fixture カタログ
2
+
3
+ `tests/integration/helpers/` で定義するテスト用ヘルパーの一覧。
4
+
5
+ ## TestContext(中核ヘルパー)
6
+
7
+ 各テストで独立した DB コンテナと Axum アプリケーションを提供する。
8
+
9
+ ```rust
10
+ pub struct TestContext {
11
+ pub app: Router,
12
+ pub db_pool: DbPool,
13
+ pub valkey: ConnectionManager,
14
+ _pg_container: ContainerAsync<Postgres>,
15
+ }
16
+
17
+ impl TestContext {
18
+ /// 新しいテストコンテキストを作成(実 PostgreSQL コンテナ起動)
19
+ pub async fn new() -> Self { /* ... */ }
20
+
21
+ /// 外部 API がエラーを返す設定で作成
22
+ pub async fn with_failing_external_api() -> Self { /* ... */ }
23
+
24
+ /// GET リクエスト(認証ヘッダー付き)
25
+ pub async fn get(&self, path: &str) -> TestResponse { /* ... */ }
26
+
27
+ /// GET リクエスト(認証なし)
28
+ pub async fn get_without_auth(&self, path: &str) -> TestResponse { /* ... */ }
29
+
30
+ /// POST リクエスト(認証ヘッダー付き)
31
+ pub async fn post(&self, path: &str) -> RequestBuilder { /* ... */ }
32
+
33
+ /// PUT リクエスト(認証ヘッダー付き)
34
+ pub async fn put(&self, path: &str) -> RequestBuilder { /* ... */ }
35
+
36
+ /// DELETE リクエスト(認証ヘッダー付き)
37
+ pub async fn delete(&self, path: &str) -> TestResponse { /* ... */ }
38
+ }
39
+ ```
40
+
41
+ ## DB 関連ヘルパー
42
+
43
+ ### PostgreSQL コンテナ
44
+
45
+ ```rust
46
+ use testcontainers::runners::AsyncRunner;
47
+ use testcontainers_modules::postgres::Postgres;
48
+
49
+ async fn create_pg_container() -> (ContainerAsync<Postgres>, String) {
50
+ let container = Postgres::default().start().await.unwrap();
51
+ let port = container.get_host_port_ipv4(5432).await.unwrap();
52
+ let url = format!("postgres://postgres:postgres@localhost:{port}/postgres");
53
+ (container, url)
54
+ }
55
+ ```
56
+
57
+ ### マイグレーション実行
58
+
59
+ ```rust
60
+ use diesel_async::AsyncPgConnection;
61
+ use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
62
+
63
+ const MIGRATIONS: EmbeddedMigrations = embed_migrations!();
64
+
65
+ async fn run_migrations(database_url: &str) {
66
+ // diesel の同期マイグレーションを blocking task で実行
67
+ let url = database_url.to_string();
68
+ tokio::task::spawn_blocking(move || {
69
+ use diesel::prelude::*;
70
+ let mut conn = PgConnection::establish(&url).unwrap();
71
+ conn.run_pending_migrations(MIGRATIONS).unwrap();
72
+ })
73
+ .await
74
+ .unwrap();
75
+ }
76
+ ```
77
+
78
+ ### テストデータ投入 (Seed)
79
+
80
+ ```rust
81
+ impl TestContext {
82
+ pub async fn seed_user(&self, new_user: &NewUser) -> User {
83
+ let mut conn = self.db_pool.get().await.unwrap();
84
+ diesel::insert_into(users::table)
85
+ .values(new_user)
86
+ .get_result(&mut conn)
87
+ .await
88
+ .unwrap()
89
+ }
90
+
91
+ pub async fn seed_users(&self, users: &[NewUser]) -> Vec<User> {
92
+ let mut conn = self.db_pool.get().await.unwrap();
93
+ diesel::insert_into(users::table)
94
+ .values(users)
95
+ .get_results(&mut conn)
96
+ .await
97
+ .unwrap()
98
+ }
99
+
100
+ pub async fn find_user_by_id(&self, id: i64) -> Option<User> {
101
+ let mut conn = self.db_pool.get().await.unwrap();
102
+ users::table.find(id)
103
+ .select(User::as_select())
104
+ .first(&mut conn)
105
+ .await
106
+ .optional()
107
+ .unwrap()
108
+ }
109
+ }
110
+ ```
111
+
112
+ ## 認証ヘッダー
113
+
114
+ ```rust
115
+ fn test_auth_header() -> HeaderMap {
116
+ let mut headers = HeaderMap::new();
117
+ headers.insert(
118
+ "Authorization",
119
+ HeaderValue::from_static("Bearer test-token-xxx"),
120
+ );
121
+ headers
122
+ }
123
+ ```
124
+
125
+ ## Axum アプリ構築
126
+
127
+ ```rust
128
+ async fn build_test_app(db_pool: DbPool, valkey: ConnectionManager) -> Router {
129
+ let state = AppState {
130
+ db_pool,
131
+ valkey,
132
+ config: Arc::new(test_config()),
133
+ };
134
+
135
+ // 本番と同じルーター構成を使用
136
+ crate::routes::routes()
137
+ .with_state(state)
138
+ }
139
+ ```
140
+
141
+ ## Fixture 選択フロー
142
+
143
+ ```
144
+ テストで何が必要?
145
+ ├─ DB アクセスが必要
146
+ │ └─ TestContext::new() を使用
147
+ │ ├─ テストデータ投入 → seed_user(), seed_users()
148
+ │ └─ DB 検証 → find_user_by_id(), find_user_by_email()
149
+
150
+ ├─ 外部 API のモック
151
+ │ └─ TestContext::with_failing_external_api() or カスタム trait 実装
152
+
153
+ └─ HTTP リクエスト送信
154
+ └─ ctx.get(), ctx.post(), ctx.put(), ctx.delete()
155
+ ```
@@ -0,0 +1,124 @@
1
+ # 並列実行フロー詳細
2
+
3
+ Agent Teams を使った並列テスト作成の全フェーズ詳細。
4
+
5
+ ## チーム構成
6
+
7
+ | 役割 | 数 | 責務 |
8
+ |------|:--:|------|
9
+ | Command(司令塔) | 1 | 分析・分担・監視・最終検証 |
10
+ | Workers(テスト実装) | 1-2 | テストファイル作成 |
11
+ | Pentagon(品質レビュー) | 1 | 品質ゲート判定 |
12
+
13
+ ## フェーズ詳細
14
+
15
+ ### P0: Parse & Analyze
16
+
17
+ ```
18
+ 入力: /integration-test users,posts
19
+
20
+ カンマで分割 → ["users", "posts"]
21
+
22
+ 各対象を分析:
23
+ users → src/handlers/users.rs → src/db/repository/users.rs → src/models/user.rs
24
+ posts → src/handlers/posts.rs → src/db/repository/posts.rs → src/models/post.rs
25
+
26
+ Worker 分担:
27
+ alpha → users (test_users.rs)
28
+ bravo → posts (test_posts.rs)
29
+ ```
30
+
31
+ ### P1: Setup Team
32
+
33
+ 1. 共通ヘルパーの確認
34
+ - `tests/integration/helpers/` が存在するか
35
+ - TestContext が対象ドメインで動作するか
36
+ - 新規 fixture が必要なら Command が追加
37
+
38
+ 2. ホワイトボード作成
39
+ - `whiteboard-template.md` に従い作成
40
+ - Key Questions を 1-3 個設定
41
+
42
+ ### P2: Launch Agents
43
+
44
+ Workers と Pentagon を `.claude/agents/` のエージェント定義を使ってサブエージェントとして起動。
45
+
46
+ **起動順序:**
47
+ 1. Pentagon(`subagent_type: "integ-test-auditor"`)— 起動後はレビュー依頼待ち
48
+ 2. Workers(`subagent_type: "integ-test-worker"`)— alpha, bravo を並列起動
49
+
50
+ ```
51
+ # Pentagon 起動
52
+ Agent(subagent_type: "integ-test-auditor", prompt: "ホワイトボード: {whiteboard_path}\nレビュー依頼を待機")
53
+
54
+ # Worker 起動(並列)
55
+ Agent(subagent_type: "integ-test-worker", prompt: "Worker名: alpha\nドメイン: {domain_a}\n...")
56
+ Agent(subagent_type: "integ-test-worker", prompt: "Worker名: bravo\nドメイン: {domain_b}\n...")
57
+ ```
58
+
59
+ ### P3: Monitor & Facilitate
60
+
61
+ ```
62
+ while 未完了タスクが存在:
63
+ ├─ Worker 完了を検出
64
+ │ ├─ ホワイトボードに Findings 転記
65
+ │ ├─ Pentagon にレビュー依頼
66
+ │ └─ Pentagon 結果を待つ
67
+ │ ├─ PASS → Quality Gate 更新、次タスクがあれば割当
68
+ │ └─ FAIL → レビュー回数確認
69
+ │ ├─ < 3 回 → Worker に差し戻し
70
+ │ └─ = 3 回 → 残存指摘付きで完了
71
+ └─ 全タスク完了 → P4 へ
72
+ ```
73
+
74
+ **差し戻し時の Worker 再実行:**
75
+ - 元の prompt に Pentagon の指摘事項を追加
76
+ - 「修正箇所」と「修正理由」を明示
77
+
78
+ ### P4: Final Verification
79
+
80
+ ```bash
81
+ # 全テスト実行
82
+ cargo test --test integration_users --test integration_posts -- --nocapture
83
+
84
+ # コード品質チェック
85
+ rustfmt tests/integration/test_users.rs tests/integration/test_posts.rs
86
+ cargo clippy --tests --quiet
87
+ ```
88
+
89
+ 失敗した場合:
90
+ - コンパイルエラー → Command が直接修正
91
+ - テスト失敗 → 原因を特定し Command が修正 or Worker に再依頼
92
+ - clippy 警告 → Command が修正
93
+
94
+ ### P5: Cleanup & Report
95
+
96
+ 1. ホワイトボードを `.claude/_docs/deleted/` に移動
97
+ 2. 最終レポート出力
98
+
99
+ ```
100
+ integration-test 並列実装完了
101
+
102
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
103
+ 対象: users, posts
104
+
105
+ 生成ファイル:
106
+ tests/integration/test_users.rs (12 tests)
107
+ tests/integration/test_posts.rs (10 tests)
108
+
109
+ テスト結果:
110
+ 22 tests passed, 0 failed
111
+
112
+ 品質ゲート:
113
+ test_users.rs: PASS (cycle 1)
114
+ test_posts.rs: PASS (cycle 2)
115
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
116
+ ```
117
+
118
+ ## タイムアウトと中断
119
+
120
+ | 状況 | 対処 |
121
+ |------|------|
122
+ | Worker が 10 分以上応答なし | Command が状態確認、必要なら再起動 |
123
+ | Pentagon が 5 分以上応答なし | Command が状態確認、必要なら再起動 |
124
+ | 3 回差し戻し後も品質不足 | 残存指摘付きで完了、レポートに注記 |
@@ -0,0 +1,80 @@
1
+ # 品質ゲート
2
+
3
+ Pentagon(Reviewer)がテストファイルをレビューする際の判定基準。
4
+ 全項目 PASS で合格、1 項目でも FAIL で差し戻し。
5
+
6
+ ## 判定項目
7
+
8
+ ### A. 5 分類カバレッジ
9
+
10
+ - [ ] 正常系テストが存在する
11
+ - [ ] 異常系テスト(バリデーションエラー、404 等)が存在する
12
+ - [ ] 境界値テスト(空リスト、最大長等)が存在する
13
+ - [ ] エッジケース(重複、同時更新等)が考慮されている
14
+ - [ ] 外部依存エラー時の挙動がテストされている(該当する場合)
15
+
16
+ ### B. 振る舞い契約の検証
17
+
18
+ - [ ] HTTP ステータスコードが正しい
19
+ - [ ] レスポンスボディの構造が正しい(フィールド名、型)
20
+ - [ ] DB の状態変更が検証されている(POST/PUT/DELETE)
21
+ - [ ] エラーレスポンスのフォーマットが統一されている
22
+
23
+ ### C. コード品質
24
+
25
+ - [ ] Given-When-Then 構造が明確
26
+ - [ ] テスト関数名が振る舞いを説明している
27
+ - [ ] テスト間に依存がない(独立して実行可能)
28
+ - [ ] 不要な assert がない(1 テスト 1 概念)
29
+ - [ ] ハードコードされたマジックナンバーがない
30
+
31
+ ### D. Hermetic & Deterministic
32
+
33
+ - [ ] 各テストが独立した DB 状態を持つ(testcontainers or トランザクション)
34
+ - [ ] 外部 API は trait DI でテストダブルに差し替えている
35
+ - [ ] 時刻依存のテストは Clock trait で制御している
36
+ - [ ] テスト実行順序に依存しない
37
+ - [ ] `sleep` や固定タイムアウトに依存しない
38
+
39
+ ### E. Rust 固有
40
+
41
+ - [ ] `#[tokio::test]` が正しく使われている
42
+ - [ ] `unwrap()` はテストコード内でのみ使用(本番コードに混入していない)
43
+ - [ ] `clippy` 警告がない
44
+ - [ ] `rustfmt` でフォーマット済み
45
+
46
+ ## 判定フロー
47
+
48
+ ```
49
+ 全項目チェック
50
+ ├─ 全 PASS → PASS(テスト承認)
51
+ ├─ FAIL あり(修正可能)→ FAIL + 具体的な修正指示
52
+ └─ FAIL あり(設計レベル)→ FAIL + 設計変更の提案
53
+ ```
54
+
55
+ ## レポートフォーマット
56
+
57
+ ```
58
+ [Pentagon Review] {test_file}
59
+
60
+ 判定: PASS / FAIL
61
+
62
+ A. 5分類カバレッジ: PASS / FAIL
63
+ {不足があれば具体的に}
64
+
65
+ B. 振る舞い契約: PASS / FAIL
66
+ {問題があれば具体的に}
67
+
68
+ C. コード品質: PASS / FAIL
69
+ {問題があれば具体的に}
70
+
71
+ D. Hermetic: PASS / FAIL
72
+ {問題があれば具体的に}
73
+
74
+ E. Rust 固有: PASS / FAIL
75
+ {問題があれば具体的に}
76
+
77
+ 修正指示:
78
+ 1. {具体的な修正内容}
79
+ 2. {具体的な修正内容}
80
+ ```
@@ -0,0 +1,88 @@
1
+ # テストケース設計ガイド
2
+
3
+ ## 5 分類体系
4
+
5
+ インテグレーションテストのケースは以下の 5 分類で網羅する。
6
+
7
+ | 分類 | 説明 | 例 |
8
+ |------|------|-----|
9
+ | **正常系** | 正しい入力で期待通りの結果 | ユーザー作成成功、一覧取得 |
10
+ | **異常系** | 不正な入力やエラー条件 | バリデーションエラー、認証エラー |
11
+ | **境界値** | 境界条件の動作確認 | 空リスト、最大長、ページ境界 |
12
+ | **エッジケース** | 特殊な状況 | 重複データ、同時更新、空文字 |
13
+ | **外部依存エラー** | 外部システムの障害 | DB 接続エラー、外部 API タイムアウト |
14
+
15
+ ## HTTP メソッド別必須テストケース
16
+
17
+ ### GET 一覧
18
+
19
+ | 分類 | テストケース |
20
+ |------|------------|
21
+ | 正常系 | データが存在する場合に全件返す |
22
+ | 境界値 | データが0件の場合に空配列を返す |
23
+ | 正常系 | ページネーションが正しく動作する |
24
+ | 境界値 | 最終ページの件数が正しい |
25
+ | 異常系 | 認証なしで 401 |
26
+
27
+ ### GET 詳細
28
+
29
+ | 分類 | テストケース |
30
+ |------|------------|
31
+ | 正常系 | 存在する ID で正しいデータを返す |
32
+ | 異常系 | 存在しない ID で 404 |
33
+ | 異常系 | 不正な ID 形式で 400 |
34
+ | 異常系 | 認証なしで 401 |
35
+
36
+ ### POST 作成
37
+
38
+ | 分類 | テストケース |
39
+ |------|------------|
40
+ | 正常系 | 有効な入力で 201 + DB に保存 |
41
+ | 異常系 | 必須フィールド欠落で 400 |
42
+ | 異常系 | バリデーション違反で 400 |
43
+ | エッジケース | 重複データで 409 (Conflict) |
44
+ | 外部依存 | 外部 API エラー時にロールバック |
45
+ | 異常系 | 認証なしで 401 |
46
+
47
+ ### PUT/PATCH 更新
48
+
49
+ | 分類 | テストケース |
50
+ |------|------------|
51
+ | 正常系 | 有効な入力で更新成功 + DB に反映 |
52
+ | 異常系 | 存在しない ID で 404 |
53
+ | 異常系 | バリデーション違反で 400 |
54
+ | 境界値 | 変更なし (同じ値) で正常応答 |
55
+ | 異常系 | 認証なしで 401 |
56
+
57
+ ### DELETE 削除
58
+
59
+ | 分類 | テストケース |
60
+ |------|------------|
61
+ | 正常系 | 存在する ID で 204 + DB から削除 |
62
+ | 異常系 | 存在しない ID で 404 |
63
+ | エッジケース | 関連データがある場合の挙動 |
64
+ | 異常系 | 認証なしで 401 |
65
+
66
+ ## テストケース導出手順
67
+
68
+ 1. **handler を読む**: ルート定義からエンドポイント一覧を把握
69
+ 2. **リクエスト/レスポンス型を読む**: DTO の構造からバリデーション条件を特定
70
+ 3. **repository を読む**: クエリロジックからエッジケースを特定
71
+ 4. **5 分類マトリクスに当てはめる**: 上記のテーブルを参考にケースを列挙
72
+
73
+ ## ケース数の目安
74
+
75
+ | エンドポイント種別 | 最小ケース数 |
76
+ |------------------|:----------:|
77
+ | GET 一覧 | 4-5 |
78
+ | GET 詳細 | 3-4 |
79
+ | POST 作成 | 5-6 |
80
+ | PUT/PATCH 更新 | 4-5 |
81
+ | DELETE 削除 | 3-4 |
82
+
83
+ ## UT との棲み分け
84
+
85
+ | テスト種別 | 対象 | DB | 外部 API |
86
+ |-----------|------|:--:|:-------:|
87
+ | UT | ビジネスロジック単体 | mock/fake | mock |
88
+ | IT | HTTP → handler → repository → DB 全層 | 実 DB (testcontainers) | trait DI |
@@ -0,0 +1,215 @@
1
+ # テスト実装パターン
2
+
3
+ インテグレーションテストで使う典型的なパターン集。
4
+
5
+ ## ファイル構成テンプレート
6
+
7
+ ```
8
+ tests/
9
+ ├── integration.rs # テストバイナリエントリポイント(mod で下記を参照)
10
+ ├── integration/
11
+ │ ├── helpers/
12
+ │ │ ├── mod.rs # 共通ヘルパー
13
+ │ │ ├── app.rs # テスト用 Axum app 構築
14
+ │ │ ├── db.rs # testcontainers DB セットアップ
15
+ │ │ └── auth.rs # テスト用認証ヘッダー
16
+ │ ├── test_users.rs # ドメインごとのテストファイル
17
+ │ └── test_posts.rs
18
+ ```
19
+
20
+ ## パターン1: リスト取得 (GET /)
21
+
22
+ ```rust
23
+ #[tokio::test]
24
+ async fn list_users_returns_all_users() {
25
+ let ctx = TestContext::new().await;
26
+ // Given: DB にテストデータを投入
27
+ ctx.seed_users(&[
28
+ NewUser { name: "Alice", email: "alice@example.com" },
29
+ NewUser { name: "Bob", email: "bob@example.com" },
30
+ ]).await;
31
+
32
+ // When: GET /api/users
33
+ let response = ctx.get("/api/users").await;
34
+
35
+ // Then
36
+ assert_eq!(response.status(), StatusCode::OK);
37
+ let body: Vec<UserResponse> = response.json().await;
38
+ assert_eq!(body.len(), 2);
39
+ }
40
+ ```
41
+
42
+ ## パターン2: 作成 (POST /)
43
+
44
+ ```rust
45
+ #[tokio::test]
46
+ async fn create_user_returns_created() {
47
+ let ctx = TestContext::new().await;
48
+
49
+ // When
50
+ let response = ctx.post("/api/users")
51
+ .json(&json!({ "name": "Alice", "email": "alice@example.com" }))
52
+ .await;
53
+
54
+ // Then: レスポンス検証
55
+ assert_eq!(response.status(), StatusCode::CREATED);
56
+ let body: UserResponse = response.json().await;
57
+ assert_eq!(body.name, "Alice");
58
+
59
+ // Then: DB にも保存されたことを検証
60
+ let user = ctx.find_user_by_email("alice@example.com").await;
61
+ assert!(user.is_some());
62
+ }
63
+ ```
64
+
65
+ ## パターン3: 詳細取得 (GET /:id)
66
+
67
+ ```rust
68
+ #[tokio::test]
69
+ async fn get_user_returns_user_when_exists() {
70
+ let ctx = TestContext::new().await;
71
+ let user = ctx.seed_user(&NewUser { name: "Alice", email: "alice@example.com" }).await;
72
+
73
+ let response = ctx.get(&format!("/api/users/{}", user.id)).await;
74
+
75
+ assert_eq!(response.status(), StatusCode::OK);
76
+ let body: UserResponse = response.json().await;
77
+ assert_eq!(body.id, user.id);
78
+ }
79
+
80
+ #[tokio::test]
81
+ async fn get_user_returns_not_found_when_missing() {
82
+ let ctx = TestContext::new().await;
83
+
84
+ let response = ctx.get("/api/users/99999").await;
85
+
86
+ assert_eq!(response.status(), StatusCode::NOT_FOUND);
87
+ }
88
+ ```
89
+
90
+ ## パターン4: 更新 (PUT /:id)
91
+
92
+ ```rust
93
+ #[tokio::test]
94
+ async fn update_user_modifies_existing_record() {
95
+ let ctx = TestContext::new().await;
96
+ let user = ctx.seed_user(&NewUser { name: "Alice", email: "alice@example.com" }).await;
97
+
98
+ let response = ctx.put(&format!("/api/users/{}", user.id))
99
+ .json(&json!({ "name": "Alice Updated" }))
100
+ .await;
101
+
102
+ assert_eq!(response.status(), StatusCode::OK);
103
+
104
+ // DB も更新されたことを検証
105
+ let updated = ctx.find_user_by_id(user.id).await.unwrap();
106
+ assert_eq!(updated.name, "Alice Updated");
107
+ }
108
+ ```
109
+
110
+ ## パターン5: 削除 (DELETE /:id)
111
+
112
+ ```rust
113
+ #[tokio::test]
114
+ async fn delete_user_removes_record() {
115
+ let ctx = TestContext::new().await;
116
+ let user = ctx.seed_user(&NewUser { name: "Alice", email: "alice@example.com" }).await;
117
+
118
+ let response = ctx.delete(&format!("/api/users/{}", user.id)).await;
119
+
120
+ assert_eq!(response.status(), StatusCode::NO_CONTENT);
121
+
122
+ // DB から削除されたことを検証
123
+ let deleted = ctx.find_user_by_id(user.id).await;
124
+ assert!(deleted.is_none());
125
+ }
126
+ ```
127
+
128
+ ## パターン6: parametrize (rstest)
129
+
130
+ ```rust
131
+ use rstest::rstest;
132
+
133
+ const LONG_NAME: &str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; // 256文字
134
+
135
+ #[rstest]
136
+ #[case("", StatusCode::BAD_REQUEST)]
137
+ #[case(LONG_NAME, StatusCode::BAD_REQUEST)]
138
+ #[case("valid_name", StatusCode::CREATED)]
139
+ #[tokio::test]
140
+ async fn create_user_validates_name(
141
+ #[case] name: &str,
142
+ #[case] expected_status: StatusCode,
143
+ ) {
144
+ let ctx = TestContext::new().await;
145
+
146
+ let response = ctx.post("/api/users")
147
+ .json(&json!({ "name": name, "email": "test@example.com" }))
148
+ .await;
149
+
150
+ assert_eq!(response.status(), expected_status);
151
+ }
152
+ ```
153
+
154
+ ## パターン7: ページネーション
155
+
156
+ ```rust
157
+ #[tokio::test]
158
+ async fn list_users_supports_pagination() {
159
+ let ctx = TestContext::new().await;
160
+ ctx.seed_users_count(25).await;
161
+
162
+ // 1ページ目
163
+ let response = ctx.get("/api/users?page=1&per_page=10").await;
164
+ assert_eq!(response.status(), StatusCode::OK);
165
+ let body: PaginatedResponse<UserResponse> = response.json().await;
166
+ assert_eq!(body.items.len(), 10);
167
+ assert_eq!(body.total, 25);
168
+
169
+ // 3ページ目(残り5件)
170
+ let response = ctx.get("/api/users?page=3&per_page=10").await;
171
+ let body: PaginatedResponse<UserResponse> = response.json().await;
172
+ assert_eq!(body.items.len(), 5);
173
+ }
174
+ ```
175
+
176
+ ## パターン8: 外部 API エラー時の挙動
177
+
178
+ ```rust
179
+ #[tokio::test]
180
+ async fn create_user_returns_error_when_external_api_fails() {
181
+ let ctx = TestContext::with_failing_external_api().await;
182
+
183
+ let response = ctx.post("/api/users")
184
+ .json(&json!({ "name": "Alice", "email": "alice@example.com" }))
185
+ .await;
186
+
187
+ assert_eq!(response.status(), StatusCode::BAD_GATEWAY);
188
+
189
+ // DB にはロールバックされていることを検証
190
+ let user = ctx.find_user_by_email("alice@example.com").await;
191
+ assert!(user.is_none());
192
+ }
193
+ ```
194
+
195
+ ## パターン9: 認証エラー
196
+
197
+ ```rust
198
+ #[tokio::test]
199
+ async fn unauthenticated_request_returns_401() {
200
+ let ctx = TestContext::new().await;
201
+
202
+ let response = ctx.get_without_auth("/api/users").await;
203
+
204
+ assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
205
+ }
206
+ ```
207
+
208
+ ## よくあるエラーと対処法
209
+
210
+ | エラー | 原因 | 対処 |
211
+ |--------|------|------|
212
+ | `connection refused` | testcontainers コンテナ未起動 | Docker デーモンが起動しているか確認 |
213
+ | `table not found` | マイグレーション未実行 | TestContext でマイグレーション実行を確認 |
214
+ | テスト間でデータが干渉 | トランザクション未ロールバック | 各テストで独立した DB / トランザクションを使用 |
215
+ | `tokio runtime` エラー | `#[test]` を使っている | `#[tokio::test]` に変更 |